创建shared_ptr时,它的管理器对象使用强大的&弱参考计数器。我理解通过使用强引用计数器shared_ptr知道何时解除分配托管对象但我不明白为什么它使用弱引用计数器。
答案 0 :(得分:7)
有两个与shared_ptr<T>
&amp; weak_ptr<T>
:
T
)如果共享计数器到达0
,则实际对象将被销毁。但只要存在共享或弱指针,控制块就必须保持活动状态,即只要共享,控制块就会被删除。 em>和弱计数器是0
。
答案 1 :(得分:3)
弱指针和强指针都有一个指向数据的指针,以及一个指向引用计数块的指针。
当您尝试将弱指针转换为强指针时,您会添加新的强计数。如果它从0递增,您知道数据已被销毁,因此您失败了。这需要访问引用计数块。
因此,引用计数块的生命周期必须超过所有未完成的弱指针的生命周期。
通过引用计数具有弱引用计数的引用计数块来确保这一点。此引用计数,当最后一个未完成的强或弱引用超出范围时,会导致智能指针销毁引用计数块。
答案 2 :(得分:1)
weak_ptr
用于需要处理有问题的堆对象的东西,但不想要声明任何阻止释放对象的所有权。此类事物的一个典型示例是想要了解对基础对象的任何更改但不想在没有其他人使用该对象的情况下保留它的观察者。