标准库提供了一个可以管理new分配的数组的unique_ptr版本。为了用一个unique_ptr管理动态数组,我们必须在对象类型后面跟一对空方括号:
//up指向一个包含10个未初始化int的数组
unique_ptr<int[]> up(new int[10]);
up.release(); //自动用delete[]销毁其指针
类型说明符中的方括号指出up指向一个int数组而不是一个int。
当一个unique_ptr指向的是一个数组时,我们不能使用点和箭头成员运算符号。毕竟unique_ptr指向的是一个数组而不是单个对象,因此这些运算符是无意义的,可以用以下操作
指向数组的unique_ptr | |
---|---|
指向数组的unique_ptr不支持成员访问运算符(点和箭头运算符) 其他unique_ptr操作不变 | |
unique_ptr<T[]> u | u可以指向一个动态分配的数组,数组元素类型为T |
unique_ptr<T[]> u(p) | u指向内置指针p所指向的动态分配的数组,p必须能转换为类型T* |
u[i] | 返回u拥有的数组中位置i处的对象,u必须指向一个数组 |
与unique_ptr不同,shared_ptr不直接支持管理动态内存, 如果希望使用shared_ptr管理一个动态数组,必须提供自己定义的删除器:
shared_ptr<int> sp(new int[10], [](int *p) {delete[] p;});
sp.reset(); //使用我们提供的lambda释放数组,它使用delete[]
//如果不指定删除器,这段代码将是未定义。它将使用 delete销毁该指针
shared_ptr不直接支持动态数组管理这一特性影响我们如何访问数组中的元素:
//shared_ptr未定义下标运算符,而且智能指针类型不支持指针算数运算
for(size_t i = 0; i != 10; ++i)
{
*(sp.get() + i) = i; //使用get获取一个内置指针
}
我们必须使用get获取一个内置指针,然后用它来访问数组元素。