【问题标题】:will weak_pointer.lock() increment the ref count of original shared_ptr which was used to create weak_ptr将weak_pointer.lock() 增加用于创建weak_ptr 的原始shared_ptr 的引用计数
【发布时间】: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 代码,我不确定我是否理解您此时的问题。 (对我来说这不是第一次)。

标签: c++ weak-ptr


【解决方案1】:

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

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

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

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

【讨论】:

  • 智能指针保持指向它们指向的对象的指针不是优化,而是根据定义
猜你喜欢
  • 2017-05-06
  • 2013-10-09
  • 1970-01-01
  • 2017-10-02
  • 1970-01-01
  • 2015-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多