将weak_pointer.lock()递增用于创建weak_ptr的原始shared_ptr的引用计数

时间:2014-03-06 00:13:52

标签: c++ weak-ptr

根据我的理解,如果我们使用所有shared_ptr对象并且存在循环依赖性,则弱​​指针用于循环依赖性问题。弱指针用于打破循环。弱指针通过使用lock()创建共享指针来实现这一点。

class A { shared_ptr<B> b; ... };
class B { weak_ptr<A>   a; ... };
shared_ptr<A> x(new A); // +1
x->b = new B;           // +1
x->b->a = x;            // No +1 here

但现在假设我创建了锁定调用x-&gt; b-&gt; a.lock(),因此x的ref计数将变为2.如果x离开作用域,仍会有内存泄漏吗?因为我使用lock()创建了一个共享指针,并且ref count变为2.请让我知道我的理解是否正确。

1 个答案:

答案 0 :(得分:3)

shared_ptr共享对象涉及两个不同的引用计数:

  • 对象的引用数,即shared_ptr个实例。
  • 控制区块的引用次数,即shared_ptrweak_ptr个实例。

weak_ptr仅对后者计数有贡献。当所有shared_ptr实例都被销毁时,将调用对象删除器,这通常是销毁对象的默认实例。如果存在弱指针,则控制块仍然存在。当所有弱指针都被破坏时,控制块也会被破坏。

所以(忽略可能在每个shared_ptr实例中直接优化缓存对象指针),在你的情况下你有x指向(隐藏给你)到控制块,它有一个指向A个实例。并且您将该实例的b成员指向第二个控制块,该控制块具有指向B实例的指针。最后,该实例有一个指向x所指向的控制块的指针,这是循环的,但不是所有权的循环。