【发布时间】:2017-12-25 06:42:18
【问题描述】:
嗨,我正在阅读 this document 和其他一些关于 C++ 的 shared_ptr 的文档,它们似乎都表明除了指向分配对象的 shared_ptr 的数量之外,引用计数对象还必须跟踪有多少weak_ptr 指针也指向该对象。我的问题是为什么?据我了解,weak_ptr 是非拥有的,因此如果指向该对象的shared_ptr 计数达到零,则可以删除该对象。这就是为什么有时我们需要使用expired 来检查weak_ptr 指向的对象的可用性。您能解释一下需要跟踪weak_ptrs 数量的原因吗?
【问题讨论】:
-
我相信这是因为否则,
weak_ptr将无法知道它是否已过期。您必须保持内存块处于活动状态,以便weak_ptrs 知道指针已过期,但您还想在所有weak_ptrs 消失后删除内存 -
@Justin 我想“你不能只测试 wp1 指向管理器对象的指针是否为空”然后我意识到“啊,你当然不能这样做,否则你解决了删除一个ptr 两次将使您的程序问题出现段错误。”
-
基本上,唯一的其他解决方案是保留所有已存储
weak_ptrs 的列表。然后,当共享计数变为 0 时,您通知每个weak_ptr内存已被破坏。这会降低效率,尤其是在使用的内存方面。 -
作为旁注,您的图形具有误导性,因为指向托管对象的指针存储在每个
shared_ptr/weak_ptr中。删除器内可能有另一个指针(在控制块又名管理器对象内)。这允许不同的指针实例具有相同的所有权关系但不同的指针。
标签: c++ c++11 shared-ptr weak-ptr