题目
使用智能指针管理动态数组
信息
- 类型:问答
- 难度:⭐
考点
unique_ptr动态数组管理, 智能指针基础用法, 资源自动释放
快速回答
使用 std::unique_ptr 管理动态数组时:
- 必须使用数组形式:
std::unique_ptr<int[]> - 通过下标
ptr[index]访问元素 - 避免手动
delete[],智能指针会自动释放内存
问题背景
在C++中,使用 new[] 分配的动态数组需要匹配 delete[] 释放内存。智能指针可以自动化这一过程,但需要特殊语法。
核心原理
std::unique_ptr 通过模板特化支持动态数组:
- 标准形式:
std::unique_ptr<T>默认使用delete - 数组特化:
std::unique_ptr<T[]>使用delete[]
代码示例
#include <memory>
// 正确用法
void demo() {
// 创建含5个整数的动态数组
std::unique_ptr<int[]> arr(new int[5]);
// 初始化数组
for (int i = 0; i < 5; ++i) {
arr[i] = i * 10; // 通过下标访问
}
// 不需要手动释放!离开作用域时自动调用 delete[]
}
// 错误用法示例
void wrong_demo() {
// 错误:使用非数组形式管理动态数组
std::unique_ptr<int> arr(new int[5]);
// 错误:尝试下标访问(编译失败)
// arr[2] = 100;
// 未定义行为:将调用 delete 而非 delete[]
}最佳实践
- 显式指定数组类型:始终使用
std::unique_ptr<T[]>管理动态数组 - 避免手动释放:依赖RAII机制自动释放资源
- 优先使用标准容器:如
std::vector比原始动态数组更安全 - 工厂函数创建:C++14+ 推荐
auto arr = std::make_unique<int[]>(5);
常见错误
- 误用
std::unique_ptr<T>管理数组(导致delete而非delete[]) - 尝试对数组智能指针使用
*或->运算符(应使用下标) - 与普通指针混用:
int* raw = arr.get();需谨慎避免悬空指针
扩展知识
shared_ptr管理数组:C++17+ 支持std::shared_ptr<int[]>,早期版本需自定义删除器:std::shared_ptr<int> sp(new int[5], [](int* p) { delete[] p; });- 与
std::vector对比:智能指针管理数组时缺乏大小信息,std::vector更推荐用于动态数组场景 - 自定义删除器:可用于管理特殊资源(如文件句柄)