在我的代码中,我使用了boost的shared_from_this功能来使用共享指针。为了简短起见,共享指针在类似的行上共享如下:
class Q: public enable_shared_from_this<Q>
{
public:
shared_ptr<Q> f()
{
return shared_from_this();
}
}
int main()
{
shared_ptr<Q> p(new Q);
shared_ptr<Q> q = p->f();
.....
.....
}
当我在gdb中检查这个时:
(gdb) p *this
$8 = {
....
<boost::enable_shared_from_this<Q>> = {
weak_this_ = boost::weak_ptr<Q>(refs=0, weak=2) = {
px = (Q *) 0xa11f2000
}
}
....
}
&#39; refs&#39;有什么意义?弱者&#39;在这里引用? refs = 0是否表示没有对象的引用?
谢谢!
答案 0 :(得分:3)
Integer
的控制块包含两个引用计数。一个是强引用计数,每个shared_ptr
递增一次到对象。当它变为零时,对象被销毁(并且被解除分配,除非它被分配了shared_ptr
)。
另一个是弱引用计数,只要有强引用就会递增一次,对于对象的每个make_shared
再次递增。当它变为零时,控制块被销毁并解除分配。
所以是的,理论上,调试器显示weak_ptr
意味着没有对该对象的引用。但是,根据程序停止的位置,这听起来不太可能,在您向我们展示的程序中,refs=0
一直存在p
结束,并且不应放弃其强大的参考。可能是调试器的显示不正确,尤其是在使用优化进行编译时。
修改强>
弱计数为2而refs为0表示所有强引用都已消失(引用该对象的所有main
个实例都已被破坏),但剩余2 shared_ptr
个;除非您查看的快照特别在最后一个weak_ptr
的析构函数中,在递减强计数之后但在递减弱计数之前,在这种情况下它意味着只剩下一个weak_ptr (如果快照在对象的析构函数中,则可以是存储在shared_ptr
中的那个)。
您是否在enable_shared_from_this
的析构函数中调用shared_from_this
并使用结果而不检查null? Q
在构造函数和析构函数中不起作用,并且始终返回null。这可能是导致崩溃的原因,并会导致您观察到的值。