我想知道为什么std::unique_ptr<>
直接支持动态数组但不是 std::shared_ptr<>
:
unique_ptr<int[]> ptr1(new int[n]); /// OK!
shared_ptr<int[]> ptr2(new int[n]); /// Incorrect: will not call delete[]
更新:我发现第二行可以重写为:
shared_ptr<int> ptr2(new int[n], default_delete<int[]>());
现在我想知道在幕后发生了什么使得std::shared_ptr
使用第二种方法,而不是类似于 std::unique_ptr
的方式?
最佳答案
对于 shared_ptr
,如果您使用 new[]
分配数组,则必须使用调用 delete[]
的自定义删除器。
此外,与处理原始指针一样,您必须小心处理向上和向下转换,以免调用未定义的行为。
unique_ptr
直接支持数组,所以当它知道它持有一个指向数组的指针时,你不能向上或向下转换,默认删除器调用 delete[ ]
。
关于c++ - 为什么 std::shared_ptr<T[]> 没有专门化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32727892/