C++ 为什么没有std::shared_ptr<;T[]>;?

C++ 为什么没有std::shared_ptr<;T[]>;?,c++,c++11,C++,C++11,我想知道为什么动态数组直接由std::unique\u ptr支持,而不是由std::shared\u ptr支持: unique_ptr ptr1(新整数[n]);//好啊 共享的_ptrptr2(新整数[n]);//不正确:将不调用delete[] 更新:我发现第二行可以重写为: shared_ptr<int> ptr2(new int[n], default_delete<int[]>()); shared_ptr ptr2(新的int[n],默认的_dele

我想知道为什么动态数组直接由
std::unique\u ptr
支持,而不是由
std::shared\u ptr
支持:

unique_ptr ptr1(新整数[n]);//好啊
共享的_ptrptr2(新整数[n]);//不正确:将不调用delete[]
更新:我发现第二行可以重写为:

 shared_ptr<int> ptr2(new int[n], default_delete<int[]>());
shared_ptr ptr2(新的int[n],默认的_delete());

现在我想知道幕后发生了什么,使得
std::shared\u ptr
与第二种方法一起工作,而不是以类似于
std::unique\u ptr
的方式工作?

如果使用
shared\u ptr
分配数组,则必须使用调用
delete[]
的自定义删除程序

此外,您必须像对待原始指针一样小心上下转换,以免调用未定义的行为


unique\u ptr
直接支持数组,因此当它知道它持有一个指向数组的指针时,您不能向上或向下转换,并且默认的删除器调用
delete[]

您会得到什么错误消息?这不是关于错误消息,而是关于第二行的正确性,因为它没有调用delete[]您是否必须使用
unique\u ptr
指定删除器(即
deleter
模板参数没有默认值)?如果我没有弄错的话,这至少是建议的。在中有这样的专门化。请看下半部分,我理解这一点,但是否由于共享的ptr的限制,它不能使用delete[]?@Vahid:
shared\u ptr
来自Boost库,它也有。它可以说是一个比
unique\u ptr
的专门化更干净的部门。但这意味着
共享\u ptr
在设计上并不积极支持阵列。你必须诱使它进入它,例如,通过使用一个自定义的删除程序。所以,原因是因为它与Boost库兼容,而且
共享_数组
还没有被移植到STL,对吗?
 shared_ptr<int> ptr2(new int[n], default_delete<int[]>());