【发布时间】:2014-03-06 00:13:52
【问题描述】:
根据我的理解,如果我们使用所有 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()创建了一个共享指针,ref count变成了2。请告诉我我的理解是否正确。
【问题讨论】:
-
当
lock()创建的对象被其析构函数销毁时,它会再次递减计数。 -
lock()的返回值怎么办?如果你忽略它,锁会立即再次被移除。 -
一个相当的simple sample program 会告诉你发生了什么。 lock() 在你使用时变得毫无价值。
-
@WhozCraig:谢谢 WhozCraig。假设我试图通过使用 lock() 返回的指针来访问某个成员变量。函数结束时,是先解除锁还是操作系统尝试释放shared_ptr(x)指向的内存。如果操作系统试图释放 shared_ptr (x) 指向的内存,就会发生内存泄漏。但是如何确保首先删除锁
-
从
lock()返回的临时共享指针立即被释放,因此引用计数也恢复到原来的状态。如果您想将呈现的代码扩展到另一个问题,您必须在问题本身中这样做。使用 as-written 代码,我不确定我是否理解您此时的问题。 (对我来说这不是第一次)。