【问题标题】:Why is there no [] operator for std::shared_ptr? [duplicate]为什么 std::shared_ptr 没有 [] 运算符? [复制]
【发布时间】:2015-01-07 12:43:51
【问题描述】:

我想知道std::shared_ptr 没有为数组定义[] 运算符这一事实背后的基本原理是什么。特别是为什么std::unique_ptr 有这个运算符而不是std::shared_ptr

【问题讨论】:

  • unique_ptr 具有管理数组的专业化,shared_ptr 没有。 operator[] 仅针对该专业提供。你是在问为什么shared_ptr 没有那个?
  • 我希望这能回答你的问题stackoverflow.com/questions/8947579/…
  • @juanchopanza 我想我是。

标签: c++ c++11 shared-ptr unique-ptr


【解决方案1】:

std::unique_ptr 仅在数组的特化中定义 operator[]std::unique_ptr<T[]>。对于非数组指针,无论如何 operator[] 没有多大意义(仅[0])。

缺少std::shared_ptr 的这种特化(在 C++11 中),这在相关问题中进行了讨论:Why isn't there a std::shared_ptr<T[]> specialisation?

您不应该在数组分配中使用非数组智能指针,除非您提供自定义删除器。特别是unique_ptr&lt;int&gt; p = new int[10] 不好,因为它调用delete 而不是delete[]。请改用unique_ptr&lt;int[]&gt;,它调用delete[]。 (而这个实现了operator[])。如果您使用shared_ptr 来保存T[],则需要使用自定义删除器。另见shared_ptr to an array : should it be used?——但它不提供operator[],因为它使用类型擦除来区分数组和非数组(智能指针类型独立于提供的删除器)。

如果您想知道为什么没有shared_ptr 专门用于数组:这是一个提议,但未包含在标准中(主要是因为您可以通过为ptr[i] 编写ptr.get() + i 来解决问题)。

【讨论】:

  • shared_ptr 使用delete you 提供(如果你提供);很有可能提供类似[]( T* p ) { delete[] p; }.
  • 是的,这主要是关于unique_ptr,因为更改该指针的删除器会更改类型(那里没有类型擦除)。对于shared_ptr,我们已经有一个专门处理delete[]
  • @JamesKanze 更新了,希望现在更清楚...
  • 在努力让 c 样式数组的 shared_ptr 像我想要的那样工作之后,我最终决定制作我自己的简单动态数组容器(使用智能指针)更容易within),然后使用 make_shared 分配容器的单个实例。
猜你喜欢
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2019-10-13
  • 1970-01-01
  • 2011-10-04
  • 2021-05-13
  • 1970-01-01
相关资源
最近更新 更多