【发布时间】:2021-06-29 14:31:49
【问题描述】:
对我来说,shared_ptr 似乎是一种懒惰的内存管理解决方案,而不是使用经过深思熟虑的零开销所有权系统unique_ptr 来拥有指针,原始指针用于观察指针,std::move 来传递所有权.
我真正需要共享所有权的唯一地方是在多线程上下文中,但即使在这种情况下,我也不使用shared_ptr,因为它不是线程安全的。
我从未见过shared_ptr 的用途,除了在开发中获得时间(这是一个正当的理由,但在编写高性能代码时不是),这让我相信shared_ptr 完全没用。
有人见过shared_ptr 在真正需要引用计数的地方实际使用吗?
编辑: 在多线程环境中似乎有很多用途。在单线程上下文中呢?
【问题讨论】:
-
嗯,“真正需要”是什么意思?你在寻找“真正的苏格兰人”吗?简单用例:在组件架构中处理共享所有权的有效方法,您不关心谁拥有一个对象,只要在没有人持有引用时该对象被销毁即可。
-
A
unique_ptr不能同时被两个线程持有。删除原始指针会很危险,而不会冒其他线程释放后使用错误的风险。 -
引用计数是线程安全的/原子的;它引用的对象不是(即您必须为此提供自己的序列化)
-
当您不知道用户将最后关闭哪个窗口时,GUI 中的多个视图。
-
顺便说一句,如果使用得当,
std::shared_ptr没有理由比原始指针慢(因为您应该只通过其原始指针访问它的对象)。std::shared_ptr的不正确 使用是作为原始指针的“安全”替代品,这是不可以的。std::shared_ptr应该只是用来管理对象的生命周期 - 仅此而已。
标签: c++ shared-ptr ownership reference-counting