【问题标题】:Does weak_ptr work alongside unique_ptr?weak_ptr 与 unique_ptr 一起工作吗?
【发布时间】:2017-03-09 16:44:43
【问题描述】:

据我了解,std::weak_ptr 用作引用 std::shared_ptr 引用的内存的安全方式,该内存可能已被释放。也可以与std::unique_ptr 一起使用吗?

【问题讨论】:

标签: c++ c++14 smart-pointers unique-ptr weak-ptr


【解决方案1】:

据我了解,std::weak_ptr 用作引用 shared_ptrs 引用的内存的安全方式,这些内存可能已被释放。

你理解错了。 std::weak_ptr 允许访问对象,其所有权由std::shared_ptr 维护而不共享。现在,当您真正了解std::weak_ptr 是什么时,您应该明白您关于std::unique_ptr 的问题没有任何意义。

【讨论】:

    【解决方案2】:

    有一个等效的指针充当std::unique_ptr 的观察者,但不会像std::weak_ptr 那样提供安全性。

    那个指针是原始指针。如果它们的寿命不超过唯一所有者,则它们可以安全使用。

    如果您需要知道原始指针所有者的生命周期是否结束,那么不,没有办法,这不是std::unique_ptr 的目标。

    【讨论】:

      【解决方案3】:

      没有。

      不幸的是,您将不得不使用std::shared_ptr,并记录std::weak_ptrs 只能暂时锁定。

      【讨论】:

      • 不幸还是幸运?双重所有权不是unique_ptr的功能
      • @curiousguy “不幸的是”,因为您必须依靠外部代码永远不会持有锁定的 std::weak_ptr 以保持长期的单一所有权语义。
      • 唯一拥有智能ptr 优于共享拥有智能ptr 的独特语法和语义优势是release 方法(不例外,保证行为)。你可以有一个 unique_ptr_except_locked_weak_ptr,并期望锁定是“短的”,但根据定义,一个(弱引用的)锁可以比某些东西更长寿并成为最后一个所有者,release() 不能保证,等等。
      • @curiousguy 是的,这就是为什么不幸的是,如果你想要弱指针,你需要放弃这些优势并切换到std::shared_ptr。看来我们在这里达成了一致:)
      • @curiousguy 好吧,我看不到任何替代方案。只有std::shared_ptr,并且相信下一个人不会将其std::weak_ptrs 锁定太久。
      【解决方案4】:

      没有。

      weak_ptr 唯一可用的构造函数是接受 shared_ptr 或另一个 weak_ptr 的构造函数。

      http://en.cppreference.com/w/cpp/memory/weak_ptr/weak_ptr

      【讨论】:

        猜你喜欢
        • 2015-05-19
        • 1970-01-01
        • 2016-08-03
        • 2013-07-06
        • 1970-01-01
        • 1970-01-01
        • 2011-08-05
        • 2013-08-23
        • 2010-10-16
        相关资源
        最近更新 更多