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

标签 c++ c++11 smart-pointers

A std::shared_ptr 在引用计数达到 0 时销毁它管理的对象。但是,我正在寻找一种智能指针,当引用计数低于 0 时对象被销毁2. 是否有智能指针会像这样运行(或者我可以让智能指针以安全的方式像这样运行)吗?

用例场景:我正在为连接建模。连接由它连接的两个端点拥有(如“智能指针的所有权”)。一旦其中一个端点被破坏,连接也应该被破坏。

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

最佳答案

可能最简单的解决方案是每一方都有一个指向对象的shared_ptr,一个指向对象的weak_ptr,以及一个指向另一方的常规指针shared_ptr.

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

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

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

关于c++ - 是否有需要多个所有者的智能指针类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39120972/

相关文章:

c++ - 返回一个指向智能指针的原始指针

python - cppyy 继承包含智能指针的类

c++ - Nodejs 插件 uv_queue_work 段错误

c++ - 在 Mac OS X 上共享一个 c++ 库,这样我就可以将用户定义的函数添加到 mySQL

c++ - std::future 的错误用法?

linux - TCP sendto (C++) 在 Linux 但不是 OSX 上失败。错误号 : EINVAL 22 Invalid argument

c++ - 在 C++ 11 中将 `nullptr` 作为 `std::shared_ptr` 返回是否安全?

c++ - Qt:Windows 10:未加载 QMYSQL 驱动程序

android - 如何在 ANDROID NDK 中从 C 文件调用 CPP 文件中的函数,反之亦然?

c++ - 为什么指针包含一些垃圾?