c++ - 为什么 std::shared_ptr<T[]> 没有专门化?

标签 c++ c++11

我想知道为什么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/

相关文章:

c++ - 从指针的 QList 中移除元素

c++ - SYSTEM_PROCESS_INFORMATION结构中的一些成员的含义是什么?

c++ - 带有 std::ate 的 std::ofstream 未在末尾打开

c++ - 查找素数和时出现内存错误

c++ - 删除未在 std::for_each 中调用,但在基于范围的 for 循环中调用?

c++ - 为什么允许编译器优化这个繁忙的等待循环?

iphone - 从 C++ 验证 iphone 收据

c++ - 如何在 BB10 中使用滚动实现 GRID/TILED Image View

c++ - move 或命名返回值优化 (NRVO)?

c++ - 将抽象类实现为其他类的接口(interface)而无需 vtable 开销