c++ 智能指针 - unique_ptr & weak_ptr

unique_ptr

unique_ptr拥有它指向的对象,即某一时刻只能有一个unique_ptr指向一个给定对象。当unique_ptr被销毁时,它指向的对象也要被销毁。

unique_ptr支持的操作如下:
unique_ptr< T> u1 unique_ptr< T,D> u2 空的unique_ptr,可以指向类型为T的对象。u1会使用delete释放它的指针,u2会使用一个类型为D的可调用对象来释放它的指针;
unique_ptr< T,D> u(d) 空unique_ptr,指向类型为T的对象;用类型为D的删除器对象d代替delete
u = nullptr 释放u指向的对象,将u置为空
u.release() u放弃对对象的拥有权,返回指针;并将u置为空
u.reset() 释放u指向的对象
u.reset(q) u指向内置指针q
u.reset(nullptr) 将u置为空

举例:
unique_ptr p2(p1.release()); //将string的所有权从p2转到p1,并将p1置为空
unique_ptr p3(new string(“ttttt”));
p2.reset(p3.release());//将”ttttt”的拥有权从p3转到p2,并且释放p2原来所指的内存

p2.release()之后需要显式的释放指针,否则就会造成内存泄露
正确的应为
auto q = p2.release();
delete q;

unique_ptr没有类似的make_shared的函数,只能通过提供的内置指针进行初始化;且不支持隐式转换;
unique_ptr不支持拷贝和赋值

unique_ptr p1(new string(“asda”)); //ok
unique_ptr p2 = p1;//不支持赋值
unique_ptr p2(p1);//不支持拷贝

unique_ptr不支持拷贝有一个特例,就是支持对将要删除的对象进行拷贝,最典型的应用是支持从函数返回一个unique_ptr,还可以返回一个局部对象的拷贝
unique_ptr clone(int p)
{
return unique_ptr(new int(p));//ok
}

unique_ptr clone(int p)
{
unique_ptr ret(new int(p));//ok
return ret;
}

unique_ptr也可以自定义删除器
unique_ptr< objT,delT> p(new objT,fcn);//p指向一个objT对象,并使用一个类型为delT的对象释放objT对象,它会调用一个名为fcn的delT类型对象
对于删除器函数而言,可以使用decltype(fcn)获取函数类型,即delT。正确的用法是unique_ptr< objT,decltype(fcn)*> p(obj,fcn);注意要使用函数fcn类型的指针。

weak_ptr

weak_ptr是一种不控制所指向对象生命周期的智能指针,它指向一个shared_ptr管理的对象,但是将一个weak_ptr绑定到一个对象不会增加它的引用计数。一旦对象的引用计数为0,那么即使此时weak_ptr依然指向该对象,对象也会被释放。

weak_ptr< T> w 空的weak_ptr指针,指向T类型的对象
weak_ptr< T> w(sp) 与shared_ptr sp指向相同对象的weak_ptr,T必须能转换为sp指向的类型
w = p p可以是一个weak_ptr或shared_ptr,赋值后w与p共享对象
w.reset() 将p置空
w.use_count() 与w共享对象的shared_ptr的数量
w.expired() 若w.use_count()为0,返回true,否则返回false
w.lock() 如果expurid为true,返回一个空的shared_ptr;否则返回一个指向w所指向的对象的shared_ptr

if(shared_ptr np = wp.lock()) //如果np不为空则条件成立
{
//np与wp共享对象
}

weak_ptr一般作为一个伴随指针类,对shared_ptr进行查询

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值