【发布时间】:2021-03-02 14:36:04
【问题描述】:
Effective Modern C++ 第 137 页的最后一个示例描绘了一个数据结构场景,其中包含对象 A、B 和 C,通过 @ 相互连接987654324@的方式如下:
std::shared_ptr std::shared_ptr
A ─────────────────▶ B ◀───────────────── C
对我来说,这意味着对象A 和C 的类(通常是两个不相关的类)必须包含std::shared_ptr<classOfB> 成员。
然后假设我们需要一个从B 回到A 的指针,并且列出了可用的选项:该指针可以是原始的、共享的或弱的,最后一个作为最佳人选。
std::shared_ptr std::shared_ptr
A ─────────────────▶ B ◀───────────────── C
▲ │
│ std::weak_ptr │
└────────────────────┘
我确实理解前两个替代方案的弱点(啊哈哈),但我也看到第三个替代方案要求成员 A 已经由一些 std::shared_ptr 管理,否则怎么能std::weak_ptr 指向它?
然而这本书并没有提到这个“限制”/假设/无论如何,所以事实是
- 我错了
- 我是对的,但出于某种我不明白的原因,这种假设很明显
- 这个假设是显而易见的,因为
std::weak_ptr需要一个已经存在的std::shared_ptr到同一个对象,但有点奇怪,在示例的开头甚至没有提到它,我想。
我问这个问题是为了理解这一点。
【问题讨论】:
-
如果
A不被std::shared_ptr处理,则没有替代方案... -
我认为这个假设是公平的。
weak_ptr在这里仅用作修复shared_ptr循环的方法。要么你已经通过共享指针管理了 A 的生命周期,在这种情况下你想要使用弱指针,或者你根本没有考虑智能指针,在这种情况下 B 无法确保 A 是活动的反正。在任何情况下都没有其他选择。 -
@IllidanS4supportsMonica,我没想到这一点。请随时将其发布为答案。
标签: c++ c++11 shared-ptr weak-ptr effective-c++