【问题标题】:Why isn't there a std::shared_ptr<T[]> specialisation?为什么没有 std::shared_ptr<T[]> 专业化?
【发布时间】:2012-01-20 20:38:24
【问题描述】:

该标准提供了std::unique_ptr 的模板特化,它可以从其析构函数中正确调用delete[]

void func()
{
   std::unique_ptr< int[] > arr(new int[10]);

   .......
}

对于std::shared_ptr,此专业化不可用,因此有必要 提供一个正确调用delete[]的删除器:

void func()
{
    // Usage
    shared_ptr array (new double [256], [](double* arr) { delete [] arr; } ); 

    ..............
}

这仅仅是一个疏忽吗? (同理有std::copy_if)还是有原因?

【问题讨论】:

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


【解决方案1】:

LWG(C++ 委员会的库工作组)简要地考虑了这种可能性,但这个想法并非没有争议。尽管争议主要是关于添加到 shared_ptr&lt;T[]&gt; 提案中的一项本可以被抛弃的功能(shared_ptr&lt;T[]&gt; 上的算术)。

但归根结底,真正的真正原因是,尽管进行了讨论,但 LWG 面前从来没有真正的书面提案来做这件事。它从来没有将任何人的优先级列表(包括我自己的)冒泡到足以花时间编写提案的程度。

最近,一些 LWG 成员就这个话题重新开始了非正式对话,我亲自制作了它的原型。但目前还没有书面提案。我认为这将是工具箱中一个不错的附加工具。它是否真的会发生,谁也说不准。

更新

shared_ptr 的数组支持现在有一个草稿 TS:

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2014/n4077.html

更新(2017 年)

现在 C++17 支持此功能。见shared_ptr::shared_ptr()的案例3

【讨论】:

  • 第一个“为什么不存在...”的问题,我也看到了一个真实的答案,还有一个动态分配的数组?有了vector和std::array,真的看不出需要(?)
  • @Nim:std::unique_ptr&lt;T[]&gt;(存在)适用于开销对您非常重要的情况。与vector&lt;T&gt; 不同,unique_ptr&lt;T[]&gt; 不包括容量开销,甚至不包括大小。客户端可能需要为大小添加外部开销,但如果数组从未调整大小,则不是容量。现在这并没有使unique_ptr&lt;T[]&gt; 成为更好的vector&lt;T&gt;。确实,我认为与后者相比,前者的用例将很少见。但前者的用例率不为零。
  • 类似地,shared_ptr&lt;T[]&gt; 有时可以用较低的开销替换 shared_ptr&lt;vector&lt;T&gt;&gt;boost::shared_array&lt;T&gt; 的存在和持续支持是一些程序员发现这种工具偶尔有用的一个论点。
  • @sellibitze:shared_ptr&lt;T[]&gt; 版本的好处是它只需要一个指针取消引用即可获取任何数组元素,而shared_ptr&lt;vector&lt;T&gt;&gt; 需要两个(一个用于shared_ptr,一个用于存储在vector 中的数组。
  • 有什么原因,为什么每个人似乎都忽略了 shared_ptr<:array>>?与我忽略的 shared_ptr 相比,有什么缺点吗?
猜你喜欢
  • 1970-01-01
  • 2015-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-20
  • 1970-01-01
相关资源
最近更新 更多