std::unique_ptr可通过指定数组类型T[]正确管理动态数组,自动使用delete[]释放内存,支持下标访问但不支持指针算术,C++11中需用new初始化且无法通过make_unique创建,需手动记录数组长度,仅支持移动语义。

在C++11中,std::unique_ptr 可以与数组结合使用,但需要特别注意模板参数的写法,否则可能导致未定义行为或资源泄漏。默认情况下,std::unique_ptr 假设管理的是单个对象,使用 delete 释放内存;而数组需要使用 delete[],因此必须显式指定数组类型。
正确声明 std::unique_ptr 管理数组
要让 std::unique_ptr 正确管理动态数组,需在类型后加上方括号 []:
-
std::unique_ptr
表示管理一个 int 类型的数组 - 该语法会自动使用 delete[] 释放内存
arr[0] = 10;
arr[1] = 20;
// 自动调用 delete[] 当离开作用域
访问数组元素
支持使用下标操作符 [] 直接访问元素,就像原始指针一样:
- arr[i] 获取第 i 个元素
- 不支持 指针算术 如 *(arr.get() + i) 虽然可行,但推荐使用 []
注意事项和限制
- 不能使用 std::make_unique 创建数组(C++14 起才支持)
- C++11 中只能通过 new T[N] 显式构造
- 无法获取原始数组大小,需自行记录长度
- 不支持复制,只允许移动语义
完整示例
#include#include iostream>
int main() {
std::unique_ptr
arr[0] = 1; arr[1] = 2; arr[2] = 3;
for (int i = 0; i std::cout }
// 自动释放内存
return 0;
}










