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[]>());