共享指针引用

时间:2016-02-24 07:33:43

标签: c++ shared-ptr

在我的代码中,我使用了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是否表示没有对象的引用?

谢谢!

1 个答案:

答案 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。这可能是导致崩溃的原因,并会导致您观察到的值。