boost :: shared_ptr use_count

时间:2009-05-21 00:41:19

标签: c++ pointers shared-ptr

我正在尝试了解以下代码中发生了什么。当删除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;
    }

3 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:1)

A - 对象将在其块结束时删除a后立即清除。但随后复制了它包含的shared_ptr,增加了它的引用计数。

因此,B - 对象在c.setRef之后的引用计数为2(由A - 对象和C引用 - 对象的{{1 }})。在其阻止结束时删除shared_ptr时,a - 对象的引用计数再次降至B,因为现在只有1的shared_ptr引用它。

c在main结束时被销毁之后,c也会在shared_ptr的销毁中被销毁,现在当引用计数降为零时,指向的c对象将被B删除。

因此,shared_ptr - 对象的引用计数:

B

答案 2 :(得分:0)

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