【发布时间】:2023-03-07 09:09:01
【问题描述】:
我正在阅读 Nicolai M. Josuttis 的“C++ 标准库”一书,以了解弱指针。作者提到了需要weak_ptr 的两个原因,而我没有得到第二个原因。任何人都可以提供一个简单的解释以及以下原因的示例(引自书中):
当您明确想要共享但不拥有对象时,会出现另一个示例。因此,您有这样的语义:对对象的引用的生命周期比它所引用的对象的寿命长。在这里,shared_ptrs 永远不会释放对象,普通指针可能不会注意到它们所引用的对象不再有效,这就带来了访问释放数据的风险。
【问题讨论】:
-
想象一下使用共享所有权创建的对象缓存。您不想让对象不必要地保持活动状态,但只要它们实际上还活着,缓存就会为您提供一种获取对象句柄的方法。
-
这个link可以帮助你
-
实际上,了解本书给出的弱指针的第一个原因可能会有所帮助 - 我怀疑它是缓存,但也许不是。
-
第一个原因相当简单。 (再次引用书中的内容):“如果两个对象使用 shared_ptrs 相互引用,并且如果不存在对这些对象的其他引用,您想要释放对象及其关联资源,shared_ptr 不会释放数据,因为 use_count每个对象的 () 仍然是 1。在这种情况下您可能希望使用普通指针,但这样做需要明确关心和管理关联资源的释放"
-
好的,第一个原因是打破循环。尽管在这种情况下您通常也不需要它们,因为循环中的一个对象具有控制另一个对象的生命周期。 (下面关于事件源/接收器的答案在 cmets 中讨论了这一点。)正如@KerrekSB 指出的那样,此示例用于缓存用例等。