我正在阅读 Scott Meyers 的“Effective C++”一书。有人提到有 tr1::shared_ptr
和 tr1::weak_ptr
就像内置指针一样,但它们会跟踪有多少 tr1::shared_ptrs
指向一个对象。
这称为引用计数。这可以很好地防止非循环数据结构中的资源泄漏,但是如果两个或多个对象包含 tr1::shared_ptrs
这样形成了一个循环,则该循环可能会使彼此的引用计数保持在零以上,即使当所有外部指针指向循环已被破坏。
这就是 tr1::weak_ptrs
进来的地方。
我的问题是循环数据结构如何使引用计数高于零。我请求一个示例 C++ 程序。 weak_ptrs
如何解决问题? (再次,请举例)。
原文由 venkysmarty 发布,翻译遵循 CC BY-SA 4.0 许可协议
shared_ptr
将引用计数机制包装在原始指针周围。因此,对于shared_ptr
的每个实例,引用计数都会增加一。如果两个share_ptr
对象相互引用,它们将永远不会被删除,因为它们的引用计数永远不会为零。weak_ptr
指向shared_ptr
但不会增加其引用计数。这意味着即使有weak_ptr
引用它,仍然可以删除底层对象.其工作方式是
weak_ptr
可用于创建一个shared_ptr
用于任何时候想要使用底层对象。但是,如果对象已被删除,则返回shared_ptr
的空实例。由于基础对象的引用计数不会随着weak_ptr
引用而增加,因此循环引用不会导致基础对象不被删除。