boost :: shared_ptr use_count - PullRequest
       6

boost :: shared_ptr use_count

0 голосов
/ 21 мая 2009

Я пытаюсь понять, что происходит в следующем коде. Когда объект-a удаляется, остается ли его переменная-член shared_ptr, объект-b остается в памяти, потому что объект-c хранит shared_ptr для объекта-b?

    class B
    {
    public:
       B(int val)
       {
          _val = val;
       }
       int _val;
    };

    class A
    {
    public:
       A()
       {
          _b = new B(121);
       }
       boost::shared_ptr<B> _b;
    };

    class C
    {
    public:
       C()
       {
       }

       void setRef( boost::shared_ptr<B> b)
       {
          _b = b;
       }
       boost::shared_ptr<B> _b;
    };

    int main()
    {
       C c;
       {
          A *a = new A();       
          cout << "a._b.use_count: " << a->_b.use_count() << endl;
          c.setRef(a->_b);
          cout << "a._b.use_count: " << a->_b.use_count() << endl;
                  delete a;
       }
       cout << c._b->_val << endl;
    }

Ответы [ 3 ]

2 голосов
/ 21 мая 2009

Нет, когда a удаляется, a -> _ b (сам указатель) перестает существовать.

Объект , на который указывает a -> _ b, будет продолжать существовать, поскольку c._b по-прежнему указывает на него.

1 голос
/ 21 мая 2009

Объект A будет очищен, как только a будет удален в конце его блока. Но файл shared_ptr, который он содержит, был впоследствии скопирован, увеличив его счетчик ссылок.

Таким образом, объект B будет иметь счетчик ссылок 2 после c.setRef (на который ссылается объект A и объект C -объекта shared_ptr). Когда a удаляется в конце его блока, то счетчик ссылок B -объекта снова падает до 1, так как только c shared_ptr ссылается на него сейчас.

После того, как c будет уничтожен в конце main, его shared_ptr будет также уничтожен как часть уничтожения c, и теперь, когда счетчик ссылок падает до нуля, указатель на B объект будет удален shared_ptr.

Итак, число ссылок объекта B:

0: before existence of a.
1: from start of lifetime of a until c.setRef
2: from c.setRef until copy of its parameter
3: from copy of c.setRef''s parameter until return of it
2: from return of c.setRef until end of a''s block
1: from end of a''s block until end of main
0: after main returned (object doesn''t exist anymore now)
0 голосов
/ 21 мая 2009

Цель shared_ptr будет оставаться активной до тех пор, пока окончательная ссылка на нее не будет удалена. В этом случае это произойдет, когда экземпляр C выйдет из области видимости.

...