为什么shared_ptr的引用计数对象需要跟踪指向该对象的weak_ptrs的数量?

dor*_*mon 17 c++ shared-ptr weak-ptr c++11

您好我正在阅读本文档和其他一些关于C++的文档shared_ptr,他们似乎都建议除了shared_ptr指向已分配对象的数量之外,引用计数对象还必须跟踪weak_ptr指向该对象的指针数量.我的问题是为什么?根据我的理解,weak_ptr是非拥有的,因此如果shared_ptr指向对象的计数达到零,则可以删除该对象.这就是为什么有时我们需要使用expired来检查a指向的对象的可用性weak_ptr.你能解释一下需要跟踪weak_ptrs 数的原因吗?

为什么我们这里需要弱计数? 在此输入图像描述

Fra*_*eux 21

std::weak_ptr是指控制块知道对象是否仍然存在,如果是,std::shared_ptr则在需要时向其提供.因此,只要存在std::weak_ptrstd::shared_ptr存在,控制块就必须存在.你需要跟踪std::weak_ptr最后一个被销毁的实例数量,就像是std::shared_ptr.

  • 是的,如果不是这样,控制块将需要包含有关所有 `weak_ptr` 实例的信息,以便它们可以在到期时被清除(以线程安全的方式,不少于)。让 `weak_ptr` 代替对 `lock()` 执行轮询要容易得多。 (2认同)

Bil*_*eal 5

shared_ptr引用计数是对象的所有者的数量.所述weak_ptr引用计数是参考计数控制块的拥有者的计数.

  • @Yakk:是的,但良好的实现使得shared_ptrs的数量表现为一个weak_ptr. (3认同)