1

根据我的理解,如果我们使用所有 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->b->a.lock() 的锁,所以 x 的引用计数将变为 2。如果 x 离开范围,仍然会有内存泄漏对吗?因为我使用 lock() 创建了一个共享指针,并且引用计数变为 2。请让我知道我的理解是否正确。

4

1 回答 1

3

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

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

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

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

于 2014-03-06T00:43:44.707 回答