C++智能指针和动态内存

标准库提供了一个可以管理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[]> uu可以指向一个动态分配的数组,数组元素类型为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获取一个内置指针,然后用它来访问数组元素。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值