shared_ptr 和 weak_ptr 的区别

新手上路,请多包涵

我正在阅读 Scott Meyers 的“Effective C++”一书。有人提到有 tr1::shared_ptrtr1::weak_ptr 就像内置指针一样,但它们会跟踪有多少 tr1::shared_ptrs 指向一个对象。

这称为引用计数。这可以很好地防止非循环数据结构中的资源泄漏,但是如果两个或多个对象包含 tr1::shared_ptrs 这样形成了一个循环,则该循环可能会使彼此的引用计数保持在零以上,即使当所有外部指针指向循环已被破坏。

这就是 tr1::weak_ptrs 进来的地方。

我的问题是循环数据结构如何使引用计数高于零。我请求一个示例 C++ 程序。 weak_ptrs 如何解决问题? (再次,请举例)。

原文由 venkysmarty 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 870
2 个回答

shared_ptr 将引用计数机制包装在原始指针周围。因此,对于 shared_ptr 的每个实例,引用计数都会增加一。如果两个 share_ptr 对象相互引用,它们将永远不会被删除,因为它们的引用计数永远不会为零。

weak_ptr 指向 shared_ptr 但不会增加其引用计数。这意味着即使有 weak_ptr 引用它,仍然可以删除底层对象.

其工作方式是 weak_ptr 可用于创建一个 shared_ptr 用于任何时候想要使用底层对象。但是,如果对象已被删除,则返回 shared_ptr 的空实例。由于基础对象的引用计数不会随着 weak_ptr 引用而增加,因此循环引用不会导致基础对象不被删除。

原文由 doron 发布,翻译遵循 CC BY-SA 4.0 许可协议

弱指针只是“观察”托管对象;他们不会“让它活着”或影响它的寿命。与 shared_ptr 不同,当最后一个 weak_ptr 超出范围或消失时,指向的对象仍然可以存在,因为 weak_ptr 不影响对象 - 它没有所有权。 weak_ptr 可以用来判断对象是否存在,并提供一个 shared_ptr 可以用来引用它。

weak_ptr 的定义旨在使其相对简单,因此您几乎无法直接使用 weak_ptr 进行操作。例如,您不能取消引用它; operator* 和 --- 都没有为 weak_ptr operator-> 定义。您无法使用它访问指向对象的指针 - 没有 get() 函数。定义了一个比较函数,以便您可以将 weak_ptrs 存储在有序容器中,仅此而已。

原文由 peterDriscoll 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题