Effective Modern C++ 第 137 页的最后一个例子描绘了一个带有对象的数据结构的场景 A
, B
, 和 C
在其中,通过 std::shared_ptr
相互连接通过以下方式:
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
到同一个对象,但有点奇怪,我认为在示例的开头甚至没有提到它。 我问这个问题是为了理解这一点。
最佳答案
你是对的,你的第三个要点是正确的。一个 std::weak_ptr
总是指现有的 std::shared_ptr
.所以,一旦我们做出决定 A 将包含shared_ptr<BClass>
并且 A 的实例被管理为 shared_ptr<AClass>
是我们可以使用 weak_ptr<AClass>
用于从 B 到 A 的反向引用。
在一个典型的用例中,您可能有一个管理三个成员的 D 类 shared_ptr<AClass> a;
, shared_ptr<BClass> b;
和 shared_ptr<CClass> c;
, 然后 D 类中的一些成员函数做 a->SetB(b);
, c->SetB(b);
, b->SetA(a);
, SetB 成员函数使用 shared_ptr's 和 SetA 使用weak_ptr(或在成员函数中转换为weak_ptr)。正如您所说,如果 D 确实以任何其他方式存储了对 A 的引用,例如原始指针 AClass* a;
或实例 AClass a;
,那么使用weak_ptr 是不可能的。
关于c++ - 了解 Scott Meyers 的第三个 std::weak_ptr 示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64908109/