【问题标题】:Actual uses of shared_ptr? [closed]shared_ptr 的实际用途? [关闭]
【发布时间】: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


【解决方案1】:

没有“必需”shared_ptr 的用例,因为没有它,C++ 是图灵完备的。因此,shared_ptr 的任何用例都必然会提高开发人员的效率。

您提到缺乏线程安全,但shared_ptr 提供的引用计数绝对是线程安全的。您可能会因为个人shared_ptr 缺乏线程安全而感到困惑。但是如果两个线程对同一个对象有不同的shared_ptrs,那么引用计数就不存在线程安全问题。

因此,由于您似乎表明线程安全引用计数将是一个有用的东西(但不是必需!),我认为这是最扣篮的用例你。

除此之外,我要指出的是,与您可能在单线程上下文中执行的各种操作相比,多线程并没有什么特别之处。如果您可以有两个线程都关心(至少是暂时的)一个对象,并且谁都不想断言对其生命周期的完全控制,那么您可以在单个线程上处理多个系统的等效情况。

【讨论】:

  • 我知道没有它,c++ 是图灵完备的,但这并不意味着 shared_ptr 或不需要引用计数的替代形式......在多线程上下文中,我现在明白有完全有效现在使用共享 ptr,但是在单线程上下文中呢?
  • @SomeProgrammer 任何大小有限的对象缓存。缓存对其管理的对象具有 shared_ptr(s) 并分发weak_ptr(s)。缓存管理器根据需要从缓存中删除对象。典型使用 3D 场景资源加载器/管理器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 2011-06-16
  • 1970-01-01
  • 2014-06-19
  • 2010-09-15
相关资源
最近更新 更多