当前位置: 首页 > news >正文

【C++:智能指针】

什么是内存泄漏

内存泄漏是指因为疏忽或者错误造成程序对一部分不再使用的内存没有进行释放的情况,内存释放不是指内存在物理上的消失,而是应用程序分配某段内存时,因设计错误,失去了对该内存的控制,从而造成内存浪费

RAII

RAII是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。
在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效,最后在对象析构的时候释放资源。借此,我们实际上把管理一份资源的责任托管给了一个对象。这种做法有两大好处:

  • 不需要显式地释放资源。
  • 采用这种方式,对象所需的资源在其生命期内始终保持有效。

智能指针的实现就是采用的这种思想 

在C++98中设计了一个auto_ptr的智能指针,但该设计存在缺陷,就淘汰了。

auto_ptr

auto_ptr的拷贝本质就是转移指针的管理权

unique_ptr

不支持拷贝构造,简单粗暴的解决拷贝带来的悬空问题。

 

shared_ptr

在unique_ptr的基础上允许拷贝,能支持这一操作的本质上,shared_ptr内部增加了一个引用计数的思路解决了拷贝问题。

简单实现shared_ptr指针代码:

 

不可以自己拷贝自己,为啥?

自己拷贝自己,shared_ptr会先释放掉自己的资源 

sp3不再指向之前的资源,释放掉之前的资源后,资源被释放,导致资源丢失,从而指针的内容变为随机值

 weak_ptr

  • 不支持RAII
  • 不单独管理资源
  • 辅助解决shared_ptr的循环引用的问题
  • 本质:赋值或者拷贝是不增加shared_ptr的引用计数
http://www.lryc.cn/news/468649.html

相关文章:

  • onlyoffice docker启用jwt并生成jwt
  • 希尔贝壳受邀参加首届“数据标注产业大会暨供需对接会”
  • 35.第二阶段x86游戏实战2-C++遍历技能
  • Jenkins发布vue项目,版本不一致导致build错误
  • vue3使用webSocket
  • 957种卫星参数文档的分享下载
  • 负载均衡详解:背景、实现技术、作用范围与常用算法
  • CCAA:产品认证基础3(产品认证方案)
  • go语言中的Scan()和Scanln()输入函数
  • UML外卖系统报告(包含具体需求分析)
  • net Core Data Protection 数据保护 加密 编码 哈希 FromServices
  • 4K手机壁纸之动漫系列
  • 关于eclipse的workspace
  • Vue引入高德地图自定义信息窗体绑定点击事件无效解决方案
  • 私域朋友圈运营
  • 【Vue】word / excel / ppt / pdf / 视频(mp4,mov) 预览
  • 如何加密电脑磁盘?电脑本地磁盘加密方法介绍
  • 1688、淘宝、京东搜索商品聚合接口技术实现与代码示例
  • 视频智能分析平台LiteAIServer烟火识别软件引领烟火检测与识别的智能新纪元
  • VUE前端按钮添加遮罩层
  • 列出机器学习方向的创新点
  • ffmpeg视频滤镜:腐蚀滤镜
  • react18中在列表项中如何使用useRef来获取每项的dom对象
  • java前后端项目问题总结
  • Qt设置浏览器为父窗口,嵌入播放器窗口
  • 运行Vue项目报错ChunkLoadError: Loading chunk 0 failed.
  • 腾讯云上基于 Apache Pulsar 的大规模生产实践
  • Linux网络:序列化与反序列化
  • Aloudata BIG 主动元数据平台支持 Oracle/DB2 存储过程算子级血缘解析
  • Java 解决阿里云OSS服务器私有权限图片通过URL无法预览的问题