Вопрос

Я пытаюсь понять, что происходит в следующем коде.Когда объект-a удаляется, остается ли его переменная-член shared_ptr object-b в памяти, потому что object-c содержит shared_ptr для object-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;
    }
Это было полезно?

Решение

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

Таким образом, B-объект будет иметь количество ссылок равное 2 после c.setRef (на который ссылается A-объект и с помощью C-объект shared_ptr).Когда a удаляется в конце своего блока, тогда количество ссылок в B-объект падает на 1 опять же, поскольку только cshared_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)

Другие советы

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

В объект то, на что указывает a-> _b, будет продолжать существовать, потому что c._b все еще указывает на это.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top