c++ - shared_ptr 的实际用途?
问题描述
对我来说,这shared_ptr
似乎是一种懒惰的内存管理解决方案,而不是使用经过深思熟虑的零开销所有权系统unique_ptr
来拥有指针,使用原始指针来观察指针以及std::move
传递所有权。
我真正需要共享所有权的唯一地方是在多线程上下文中,但即使在这种情况下,我也不使用shared_ptr
它,因为它不是线程安全的。
shared_ptr
除了在开发中获得时间(这是一个正当的理由,但在编写高性能代码时不是)之外,我从未见过其他用途,这让我相信这shared_ptr
是完全没用的。
有没有人见过shared_ptr
真正需要引用计数的地方的实际用途?
编辑:在多线程环境中似乎有很多用途。在单线程上下文中呢?
解决方案
没有shared_ptr
“必需”的用例,因为没有它,C++ 是图灵完备的。因此,任何用例shared_ptr
都必须提高开发人员的效率。
您提到缺乏线程安全性,但提供的引用计数shared_ptr
绝对是线程安全的。您可能会因为个人缺乏线程安全而感到困惑shared_ptr
。但是如果两个线程shared_ptr
对同一个对象有不同的 s,那么引用计数就没有线程安全问题。
因此,由于您似乎表明线程安全引用计数将是一个有用的东西(虽然不是必需的!),我认为这对您来说是最扣篮的用例。
除此之外,我要指出的是,与您可能在单线程上下文中执行的各种操作相比,多线程并没有什么特别之处。如果您可以有两个线程都关心 - 至少是暂时的 - 关于一个对象,并且谁都不想断言对其生命周期的完全控制,那么您可以在单个线程上有多个系统的等效情况。
推荐阅读
- r - 如何优雅地将因子标签传输到另一个变量?
- google-apps-script - 无法安装我们从 G-suite 市场开发的插件
- html - 如何从 Bootstrap 页面中删除底部的空格?
- node.js - TypeError : i 不是函数(用 epsagon 包裹的 AWS Lambda)
- vue.js - Axios - 在 vuex 操作中从 api 获取数据?
- ios - 使用共享实例设置 viewController 属性仍然为零
- amazon-web-services - AWS 中用于 Redis 运行状况检查的 HTTP PATH
- mysql - 需要将excel数据加载到sql中,然后我需要使用sql数据进行预测
- arrays - 如何在不知道 C 中确切行数的情况下将多维数组复制到另一个数组?
- javascript - jQuery 的 dblclick 事件在我的代码中不起作用