c++智能指针(四)之unique_ptr

本文介绍了C++中的unique_ptr,强调了其唯一所有权的特性,不能被拷贝或赋值。详细讨论了unique_ptr的初始化方式,如需绑定new返回的指针,并指出在某些情况下可以转移所有权。此外,还讲解了如何向unique_ptr传递自定义删除器以改变对象的释放方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

unique_ptr

和shared_ptr不同,某个时刻只能有一个unique_ptr指向一个给定的对象。

初始化

没有类似make_shared的标准库函数返回一个unique_ptr,需要将其绑定到一个new返回的指针上。

    unique_ptr<int> u(new int(1024));

由于unique_ptr拥有它所指向的对象,所以他不支持普通的拷贝和赋值操作。

unique_ptr<int> u(new int(1024));
unique_ptr<int> m(u);//错误,unique_ptr不支持拷贝

unique_ptr<int> u1;
u1 = u;//错误,unique_ptr不支持赋值

虽然我们不能拷贝或者赋值unique_ptr,但是可以通过调用release或者reset将指针的所有权从一个非const的unique_ptr转移给另一个unique;

unique_ptr<int> u(new int(1024));
//将所有权从u转移给m
unique_ptr<int> m(u.release());//release将u置空
unique_ptr<int> n(new int(2048));
m.reset(n.release());//reset释放了m原来指向的内存,m指向n原来指向的内存

如果我们不用另一个智能指针来保存release返回的指针,我们的程序就负责资源的释放。

u.release();//错误,p2不会释放内存,而我们丢失了指针。
auto p = u.release();//正确,但我们必须记得delete(p)

不能拷贝unique_ptr的规则有一个例外:我们可以拷贝或复制一个将要被销毁的unique_ptr。最常见的例子是从函数返回一个unique_ptr:

unique_ptr<int> clone(int p){
    return unique_ptr<int>(new int(p));//正确
}

还可以返回一个局部对象的拷贝:

unique_ptr<int> clone(int p){
    unique_ptr<int> ret (new int(p));//正确
    return ret;//正确
}

向unique_ptr传递删除器

类似shared_ptr,unique_ptr默认情况下用delete释放它指向的对象。与shared_ptr一样,我们可以重载一个unique_ptr默认的删除器。

unique_ptr<objT,delT> p(new objT,fcn);//p指向一个类型为objT的对象,并使用一个类型为delT的对象释放objT对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值