C++——智能指针auto_ptr、unique_ptr、share_ptr、weak_ptr

auto_ptr

相对于普通指针分配内存,需要自己new and delete,若不delete,就会造成内存泄露。auto_ptr智能指针可以做到,指针失效时自动回收内存空间。该指针可以进行复制构造与赋值构造,所以可能造成两个(或多个)指针指向同一内存空间的情况,导致内存空间被释放两次(或多次),造成错误。
在这里插入图片描述

unique_ptr

为了改进auto_ptr的漏洞,unique_ptr智能指针不允许复制构造与赋值构造,也即编程开始便约束了指针无法指向同个空间,避免内存空间被多次释放的错误。但unique_ptr允许移动复制构造与移动赋值构造,即将当前指针的所有权进行转移,之后原先的指针将不再指向该内存,实现一针只指一区域。
在这里插入图片描述

share_ptr

能否实现一针指多区域但不造成内存被多次释放的错误呢?答案是可以的,采用引用计数,一个智能指针指向对象的引用,则加1。当智能指针所指对象引用的计数为0,该内存空间才被释放,否则,不释放。但是嵌套引用造成了一个问题——相互引用,导致内存空间无法到达智能指针引用计数为0的局面,即永远无法释放内存空间。

在这里插入图片描述

在这里插入图片描述

weak_ptr

为了解决相互引用导致的内存空间无法释放,可以使用weak_ptr代替相互引用的其中一个share_ptr,使一个对象智能指针计数可到达0,实现内存空间的释放。weak_ptr的作用即指向资源空间时,不增加智能指针引用计数,并且其不具有资源空间的所有权限。

在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值