13.C++11中智能指针shared_ptr,unique_ptr,weak_ptr注意点

1shared_ptr

shared_ptr是一个引用计数智能指针,用于共享对象的所有权。

可以从一个裸指针、另一个shared_ptr、一unique_ptr、或者一个weak_ptr构造。

析构函数被调用时引用计数减1;当引用计数减0时,调用删除器删除对象;默认operator delete

构造函数的第二个参数接受一个删除器,这样就可以定制自己的资源分配回收器了。

不要为了防止资源泄漏而使用shared_ptr,应该使用unique_ptr,因为前者耗资源。

多线程中使用时,对引用计数的操作是不带锁的,所以应该转换成weak_ptr

注意:

1、不要多次引用同一个数据,这会造成多次删除而出错;

2、包装this指针的问题;

3、循环引用导致内存泄露;

4、多线程使用。

2weak_ptr

week_ptr是对对象的一种弱引用,不会增加对象的引用计数

week_ptrshared_ptr之间可以相互转换,shared_ptr可以直接赋值给week_ptrweek_ptr可通过调用lock函数来获得shared_ptr(如果对象已经被释放,则返回一个空的shared_ptr

强引用:被引用的对象还活着时,这个引用必然存在,例如shared_ptr弱引用:被引用的对象还活着时,这个引用不一定存在例如week_ptr。弱引用并不修改该对象的引用计数,这意味这弱引用并不对对象的内存进行管理,在功能上类似于普通指针,但一个比较大的区别是,弱引用能检测到所管理的对象是否已经被释放,从而避免访问非法内存

可以用来打破循环引用。

依附shared_ptr而存在,单独存在无意义。

在多线程时,应当将shared_ptr转成weak_ptr

3unique_ptr

unique_ptr是一个独享所有权的智能指针。

1保存指向某个对象的指针,当它本身被删除释放的时候,会使用给定的删除器释放它指向的对象

2无法进行复制构造,也无法进行复制赋值操作但可以进行移动构造和移动赋值操作;

简单来说, unique_ptr就是一个封装了对象指针和其删除器的对象,当自身析构时,调用被封装对象的删除器。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值