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

【C++】RAII思想与智能指针原理——有效避免内存泄露问题

目录

RAII思想

智能指针原理

内存泄露与智能指针


个人主页:东洛的克莱斯韦克-CSDN博客

RAII思想

RAII——用对象的生命周期控制程序资源

一个类有构造函数和析构函数,这两个函数在对象生命的开始和结束自动调用。通过构造函数接管特定的资源,在通过析构函数释放对应的资源。

我们实际上把管理一份资源的责任托管给了一个对象。这种做 法有两大好处:

1.不需要显式地释放资源。

2.采用这种方式,对象所需的资源在其生命期内始终保持有效。

用RAII思想设计一个类

template<class T>
class SmartPtr {
public:SmartPtr(T* ptr = nullptr): _ptr(ptr){}~SmartPtr(){if(_ptr)delete _ptr;}private:T* _ptr;
};

智能指针原理

RAII是智能指针的基石,在RAII思想的设计上,重载*  -> 等操作符,是该类实例化出的对象可以像指针一样使用。

template<class T>
class SmartPtr {
public:
SmartPtr(T* ptr = nullptr): _ptr(ptr){}
~SmartPtr(){if(_ptr)delete _ptr;}
T& operator*() {return *_ptr;}
T* operator->() {return _ptr;}
private:
T* _ptr;
};

内存泄露与智能指针

什么是内存泄漏:内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内 存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对 该段内存的控制,因而造成了内存的浪费。

内存泄漏的危害:长期运行的程序出现内存泄漏,影响很大,如操作系统、后台服务等等,出现 内存泄漏会导致响应越来越慢,最终卡死。

当我们new出一块空间时,如果用普通指针管理该空间的生命周期,难免会有内存泄露的风险。我们可以用一些内存泄露检测的工具或插件规避风险。也可以用智能指针接管资源,让对象的生命周期和资源的生命周期挂钩。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 数字时代的内容安全治理:审核与管理的艺术
  • 机器学习 第6章 支持向量机
  • 【QT | 开发环境搭建】Linux系统(Ubuntu 18.04) 安装 QT 5.12.12 开发环境
  • AiThinkerIDE_V1.5.2+AiThinkerProjectForESP开发环境安装
  • 【flask框架搭建服务器demo】Python 使用轻量级 Flask 框架搭建 Web 服务器可视化数据库数据demo
  • 前端axios封装request请求,在request(编译时)里面使用windows报错
  • 8 大模型微调
  • 数学建模学习(124):使用Python实现模糊ARAS方法从原理到实战
  • 如何在知行之桥上通过业务单号查找原始报文?
  • 【推荐】多模态基础大模型技术白皮书|附下载
  • 衡石产品手册--数据集如何配置对接和开发
  • 限流策略探讨
  • 关于springboot的Rest请求映射处理的源码分析(二)
  • Furion+SqlSugar+Swagger企业级后端工程师 - 学习路线总目录
  • 爬虫入门学习
  • 【Leetcode】104. 二叉树的最大深度
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • 2018以太坊智能合约编程语言solidity的最佳IDEs
  • CAP 一致性协议及应用解析
  • CentOS7简单部署NFS
  • CentOS学习笔记 - 12. Nginx搭建Centos7.5远程repo
  • es6
  • ES6, React, Redux, Webpack写的一个爬 GitHub 的网页
  • flutter的key在widget list的作用以及必要性
  • javascript 总结(常用工具类的封装)
  • JavaScript异步流程控制的前世今生
  • vue和cordova项目整合打包,并实现vue调用android的相机的demo
  • vue脚手架vue-cli
  • XML已死 ?
  • 基于web的全景—— Pannellum小试
  • 买一台 iPhone X,还是创建一家未来的独角兽?
  • 微信支付JSAPI,实测!终极方案
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • ​软考-高级-信息系统项目管理师教程 第四版【第23章-组织通用管理-思维导图】​
  • # .NET Framework中使用命名管道进行进程间通信
  • #### golang中【堆】的使用及底层 ####
  • #QT(智能家居界面-界面切换)
  • #VERDI# 关于如何查看FSM状态机的方法
  • (2)(2.4) TerraRanger Tower/Tower EVO(360度)
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (k8s)kubernetes集群基于Containerd部署
  • (pojstep1.1.2)2654(直叙式模拟)
  • (分布式缓存)Redis分片集群
  • (三分钟)速览传统边缘检测算子
  • ***linux下安装xampp,XAMPP目录结构(阿里云安装xampp)
  • . Flume面试题
  • .NetCore+vue3上传图片 Multipart body length limit 16384 exceeded.
  • .pings勒索病毒的威胁:如何应对.pings勒索病毒的突袭?
  • /ThinkPHP/Library/Think/Storage/Driver/File.class.php  LINE: 48
  • ??在JSP中,java和JavaScript如何交互?
  • @angular/cli项目构建--http(2)
  • [ C++ ] 继承
  • [.net 面向对象程序设计进阶] (19) 异步(Asynchronous) 使用异步创建快速响应和可伸缩性的应用程序...
  • [20150904]exp slow.txt
  • [240527] 谷歌 CEO 承认 AI 编造虚假信息问题难解(此文使用 @gemini 命令二次创作)| ICQ 停止运作