正确声明std::unique_ptr<int[]>可管理数组,避免未定义行为;应使用下标访问元素,且优先选用std::vector以获得更安全完整的功能支持。
在C++中,std::unique_ptr 是一种智能指针,用于管理动态分配对象的生命周期,确保资源在不再需要时自动释放。当与数组结合使用时,需要特别注意语法和行为,否则可能导致未定义行为或资源泄漏。
正确声明指向数组的 unique_ptr
默认情况下,std::unique_ptr 假定管理的是单个对象。如果要管理数组(通过 new[] 分配),必须显式指定数组类型,以便使用正确的删除方式(即 delete[] 而不是 delete)。
正确声明方式如下:
std::unique_ptr<int[]> arr(new int[10]);
这里 int[] 表明这是一个数组类型,unique_ptr 会自动使用 delete[] 来释放内存。
立即学习“C++免费学习笔记(深入)”;
访问和操作数组元素
一旦创建了指向数组的 unique_ptr,可以像普通指针一样使用下标操作符访问元素:
arr[0] = 42; arr[5] = 100;
也可以使用指针算术或 get() 获取原始指针:
int* raw = arr.get(); *(raw + 1) = 200;
为什么不能用默认 unique_ptr 管理数组?
如果错误地使用:
std::unique_ptr<int> bad(new int[10]); // 错误!delete 而非 delete[]
这会导致未定义行为,因为析构时会调用 delete 而不是 delete[],C++ 标准规定:用 new[] 分配的内存必须用 delete[] 释放。
推荐替代方案:优先使用 std::vector
虽然 unique_ptr<T[]> 可以管理数组,但它不提供 size()、begin()/end() 等容器接口,也不支持动态扩容。对于大多数场景,更推荐使用 std::vector:
std::vector<int> vec(10); // 更安全,功能更完整
只有在明确需要动态分配原始数组且无法使用 vector 时(如对接 C 接口),才考虑使用 unique_ptr<T[]>。
基本上就这些。只要记住声明时加上 [],并优先选择 vector,就能避免常见陷阱。