c++++的智能指针中unique_ptr天然支持数组管理,而shared_ptr需要自定义删除器。1. unique_ptr通过声明数组类型如std::unique_ptr

C++的智能指针确实可以管理数组,但不是所有智能指针都“天生”支持数组,需要特别注意用法。
unique_ptr和
shared_ptr都能用来管理数组资源,但它们在处理数组时的行为和普通对象略有不同。

unique_ptr
对数组的支持
unique_ptr是专为独占式资源管理设计的,它对数组的支持是原生支持的,只要你在声明的时候指定数组类型即可。

std::unique_ptrarr(new int[10]);
这样声明后,
unique_ptr会使用数组版本的析构函数来释放内存(即自动调用
delete[]而不是
delete),避免了内存泄漏或未定义行为。
立即学习“C++免费学习笔记(深入)”;
使用建议:
- 如果你管理的是一个动态分配的数组,优先使用
unique_ptr
。 - 不要试图用
unique_ptr
去管理数组,那样会导致错误释放(只调用delete
)。 - 可以配合
std::make_unique
来创建数组(C++14起支持):
auto arr = std::make_unique(10);
shared_ptr
对数组的支持
shared_ptr的默认构造并不知道你要管理的是数组类型,因此如果你直接传入数组指针,它不会自动调用
delete[],而是调用
delete,这会导致未定义行为。

不过你可以通过自定义删除器的方式来解决这个问题:
std::shared_ptrarr(new int[10], [](int* p){ delete[] p; });
这样就能确保数组被正确释放。
使用技巧:
- 管理数组时必须手动提供删除器,否则有风险。
- 删除器可以用 lambda、函数指针或者函数对象。
- 如果你不小心漏掉了删除器,可能会引发崩溃或内存泄漏。
- 也可以封装成模板函数简化重复代码:
templateusing array_deleter = std::default_delete ; template std::shared_ptr make_array(size_t size) { return std::shared_ptr (new T[size], array_deleter ()); }
实际开发中怎么选?
在实际项目中,选择哪种智能指针管理数组,取决于你的需求:
- 如果只需要单个对象拥有数组资源,就用
unique_ptr
,简单安全。 - 如果多个对象需要共享数组资源,那就用
shared_ptr
加上删除器。 - 如果你不想自己管理数组,也可以考虑使用标准库容器如
std::vector
或std::array
,它们本身就带有内存管理功能,更安全也更容易使用。
基本上就这些。智能指针对数组的支持不算复杂,但容易因为疏忽导致问题,特别是
shared_ptr没配好删除器的情况。只要记住:
unique_ptr
天然支持数组shared_ptr
需要自定义删除器
就不会踩坑了。










