我正在尝试了解以下代码中发生了什么。当删除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;
}
答案 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
实例超出范围的时候。