我试图理解下面的代码中发生了什么。当object-a被删除时,它的shared_ptr成员变量object-b是否仍然保留在内存中,因为object-c保存了object-b的shared_ptr?

    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 再次因为仅 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)

其他提示

不,当a被删除时,a->_b(指针本身)将不复存在。

目的 a->_b 指向的将继续存在,因为 c._b 仍然指向它。

的目标 shared_ptr 将保持有效,直到删除对它的最终引用。在这种情况下,这将是当 C 实例超出范围。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top