是否有需要多个所有者的智能指针类型?

Mar*_*aux 9 c++ smart-pointers c++11

std::shared_ptr当引用计数达到0时,A 会破坏它正在管理的对象.但是,我正在寻找一种智能指针,当引用计数低于2时,对象会被销毁.是否存在一个类似于此的智能指针(或我能以一种安全的方式使智能指针表现得像这样吗?

用例场景:我正在建模连接.连接由它连接的两个端点拥有(如"智能指针所有权").只要其中一个端点被破坏,连接也应该被销毁.

我知道我可以delete通过适当的析构函数中的经典语句来实现这一点(因为在这种情况下我的"低于2"的要求非常简单).但我认为这是一种智能指针的有效用例,我很想知道我是否可以用现代方式做到这一点.

Dav*_*rtz 4

也许最简单的解决方案是每一方都有一个shared_ptr指向对象的 a ,一个weak_ptr指向对象的指针,以及一个指向另一方的shared_ptr.

要访问该对象,您需要锁定weak_ptr. 如果失败,该对象就会消失。

为了摧毁自己,你可以锁定weak_ptr,通过你的常规指针重置对方的指针shared_ptr,重置你自己的shared_ptr,然后摆脱锁定的结果weak_ptr

或者,您可以只使用计数器和常规指针。如果计数器为 1,您就知道另一边已经消失,因此您可以销毁该对象。

  • @MartijnCourteaux,这是矫枉过正,因为您想要的所有权语义并不是那么微不足道。两个对象都拥有该连接,但也可以杀死它,无论另一个对象是否还活着。有点奇怪。 (2认同)