【问题标题】:Recommended usage of std::unique_ptr [duplicate]推荐使用 std::unique_ptr [重复]
【发布时间】:2013-03-06 19:03:54
【问题描述】:

std::unique_ptr 的推荐用途是什么?

我发现:

About unique_ptr performances

我已经知道了:

  1. std::unique_ptr 是用 C++11 开发的,作为 std::auto_ptr 的替代品
  2. std::unique_ptr 没有引用计数并且“拥有”它指向的对象
  3. 没有std::unique_ptr 的复制/分配
  4. 当我需要一个唯一指针时,std::unique_ptr 是转到结构体

我想知道的:

  1. 使用std::unique_ptr 比某些东西更可取(除了唯一性)
    别的?在这种情况下我能得到什么?
  2. 如果是这样,在什么情况下以及何时?
  3. 考虑到移动语义的需要,这会使std::unique_ptr 不那么受欢迎
    总体?
  4. 如果std::shared_ptr 足以满足几乎所有的动态内存管理 情况,为什么我可以使用std::unique_ptr 问题(再次,其他
    比唯一性)?

【问题讨论】:

  • 因为类型被称为unique_ptr,我觉得奇怪的是你正在寻找其他用途而不是唯一......
  • @Mushy:您需要回答的主要问题是所有权问题。在选择智能指针时没有其他重要的事情,这在我链接到的问题中得到了很好的回答。你链接到的问题让我投了反对票(从早些时候开始),因为它根本没有显示任何确定性,并且对“数据”提出了错误的问题。
  • stackoverflow.com/questions/8706192/… 在整体含义和意图上可能最接近我的问题。在根据提供的最接近的建议研究或发布我的问题时,我没有看到 stackoverflow.com/questions/8706192/…

标签: c++ c++11 smart-pointers unique-ptr


【解决方案1】:

理论上,您应该对所有指针使用unique_ptr,除非您知道要共享它,在这种情况下您应该使用shared_ptr。原因是unique_ptr 的开销较少,因为它不计算引用。

但是,unique_ptr 是可移动的,但不可复制,因此使用一个作为成员变量可能需要您编写更多代码(例如移动构造函数),通过值传递一个意味着您需要使用 std::move等等。结果,有些人出于懒惰而使用shared_ptr,因为它更容易,而且性能差异对于他们的应用程序可能并不显着。

最后,一个原始指针可以很好地观察——指针的使用永远不会影响生命周期。仔细选择正确的指针类型可以让阅读您的代码的人很好地理解您在做什么。有关更多信息,请参阅 Herb Sutter 的文章 Elements of C++ Style,特别是“禁止删除”部分。

【讨论】:

  • =default 和隐式移动成员可以轻松处理额外的代码。
  • 如果在添加 unique_ptr 之前不需要显式移动构造函数,则之后不需要显式移动构造函数。唯一需要编写更多代码的情况是,当您做了一些禁用隐式移动构造函数的操作时。
  • @DeadMG 我仍在等待编译器中的 =default,但是是的
  • @KateGregory 使用另一个编译器;-)
猜你喜欢
  • 2013-01-07
  • 1970-01-01
  • 2012-11-14
  • 2015-07-05
  • 1970-01-01
  • 1970-01-01
  • 2015-10-28
  • 2020-05-26
相关资源
最近更新 更多