0

我试图了解以下代码中发生了什么。当object-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;
    }
4

3 回答 3

2

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

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

于 2009-05-21T00:55:22.437 回答
1

-object将在其块的末尾被删除后A立即被清理。a但是它包含的 shared_ptr 随后被复制,增加了它的引用计数。

因此,B-object 之后的引用计数将为 2 c.setRef(由A-object 和C-object's引用shared_ptr)。当a在其块的末尾删除时,B-object的引用计数1再次下降,因为现在只有c'shared_ptr 正在引用它。

cmain 结束时被销毁后,它shared_ptr也将作为c' 销毁的一部分被销毁,现在随着引用计数降至零,指向的B对象将被 删除shared_ptr

因此,B-object 的引用计数:

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)
于 2009-05-21T00:56:15.273 回答
0

的目标shared_ptr将保持活动状态,直到对它的最终引用被删除。在这种情况下,这将是C实例超出范围的时候。

于 2009-05-21T00:54:30.300 回答