根据我的理解,如果我们使用所有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.请让我知道我的理解是否正确。
答案 0 :(得分:3)
shared_ptr
共享对象涉及两个不同的引用计数:
shared_ptr
个实例。shared_ptr
和weak_ptr
个实例。 weak_ptr
仅对后者计数有贡献。当所有shared_ptr
实例都被销毁时,将调用对象删除器,这通常是销毁对象的默认实例。如果存在弱指针,则控制块仍然存在。当所有弱指针都被破坏时,控制块也会被破坏。
所以(忽略可能在每个shared_ptr
实例中直接优化缓存对象指针),在你的情况下你有x
指向(隐藏给你)到控制块,它有一个指向A
个实例。并且您将该实例的b
成员指向第二个控制块,该控制块具有指向B
实例的指针。最后,该实例有一个指向x
所指向的控制块的指针,这是循环的,但不是所有权的循环。