c++ - 了解 Scott Meyers 的第三个 std::weak_ptr 示例

标签 c++ c++11 shared-ptr weak-ptr effective-c++

Effective Modern C++ 第 137 页的最后一个例子描绘了一个带有对象的数据结构的场景 A , B , 和 C在其中,通过 std::shared_ptr 相互连接通过以下方式:

   std::shared_ptr       std::shared_ptr
A ─────────────────▶ B ◀───────────────── C
对我来说,这意味着对象的类 AC是(通常是两个不相关的类)的实例必须包含 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/

    相关文章:

    C++11 实验,为什么我不能使用某些功能?

    c++ - 如何将 C++ 变量存储为 NSDictionary 中的值?

    c++ - 关于 Cygwin 的一些问题[Windows 中的 Linux](套接字、线程、其他编程和 shell 问题)

    c++ - GCC 原子 shared_ptr 实现

    python - 在 python 扩展中操作来自 SWIG 的共享指针

    c++ - 读取多语言文件 - wchar_t vs char?

    c++ - 如何声明包含整数数组的对象

    c++ - std::string::resize() 收缩时会抛出异常吗?

    c++ - 在 VS1012 中使用 std::move 将 std::unique_ptr 发送到 std::thread

    c++ - 使用 shared_ptr 时如何检测循环