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

c++里对 new 、delete 运算符的重载

(1)c++ 里 我们可以用默认的 new 和 delete 来分配对象和回收对象。 new 可以先申请内存,再调用对象的构造函数; delete 则先调用对象的析构函数,再回收内存。当然,当我们为类定义了 operator new () 和 operator delete () 函数以后,编译器就不再调用全局的同名函数,而是调用咱们自己定义的版本。一个简单的例子如下:

在这里插入图片描述

系统提供的 operator new() / delete() 函数的定义原型如下:

void* __CRTDECL operator new  (   size_t _Size  );void* __CRTDECL operator new[](   size_t _Size  );void __CRTDECL operator delete   (   void* _Block  ) noexcept;void __CRTDECL operator delete[] (   void* _Block  ) noexcept;

但咱们仍担心自己重载的 operator new() / delete() 函数是否会造成内存泄露,用王老师课堂里讲的 MFC 框架的,不带断点的 F5 调试,测试以下(我们把 结构 A 的定义写进 MFC 工程,并在初始化区添加 new A / delete A 的代码):

在这里插入图片描述

可见咱们编写的 operator new() / delete() 函数的功能是完善的,可以像系统提供的同名函数一样使用,不会造成内存泄露。

(2 ) 为什么在 c++ 里对 new / delete 关键字的使用 , 来申请和释放对象,编译器会在计算好对象或其数组占据的字节数后 主动去调用 函数名 operator new() / delete() 呢?认为,这应该是编译器自己的规定。在处理代码文本时 , 规定好了这种对应关系。看过正则表达式的都知道,电脑依据正则表达式的语法对文本的强大的处理能力。源代码其实也是文本。类似的这种调用转换,还存在于其它的运算符:
对 ++a 的调用(a 是可调用对象),转换为 operator ++( );
对 a++ 的调用(a 是可调用对象),转换为 operator ++(int);
对 a(5) 的调用(a 是可调用对象),转换为 operator ( ) (int);

对 a + 5 的调用(a 是可调用对象),转换为 operator int (); // 类型转换运算符,把 对象 a 转换为 int 类型。

所以,系统对 new 和 delete 关键字的处理,也应该与上面类似。

(3 ) 在定义了类自己的 new / delete 运算符函数后,仍想使用全局的 operator new() / delete() 函数,应该在其前面加上作用域运算符。:: 即表示从全局 std 空间寻找符号名,测试如下图:

在这里插入图片描述

(4 ) 王老师课本讲的公共内存池技术,嵌入式指针技术范例:

在这里插入图片描述

(5) 再次用 mFC 框架验证咱们自己编写的对对象数组的申请和释放 new[ ] / delete[ ] 是否会造成内存泄露:

在这里插入图片描述

(6 ) 还有定点 new :一般的 new 是先申请内存,再构造对象。但 定点 new 是在已存在的内存地址上直接构造对象。

在这里插入图片描述

谢谢

相关文章:

  • 4K高质量视频素材库,剪辑必备
  • MyBatis总结(2)- MyBatis实现原理(三)
  • 支付宝H5支付
  • wsl子系统ubuntu20.04 设置docker服务开机自启动
  • 第4天:用户认证系统实现
  • 【大分享06】收、治、用、安“四管齐下”, 做好多业务系统电子文件归档与管理
  • Spire.PDF for .NET【文档操作】演示:如何删除 PDF 中的图层
  • Matlab基础篇:数据输入输出
  • NXP i.MX8系列平台开发讲解 - 3.15 Linux 之USB子系统(一)
  • 【机器学习300问】119、什么是语言模型?
  • 人工智能在气象预报领域的崛起:GraphCast引领新纪元
  • 使用 Redis + Lua 实现分布式限流
  • 如何修改jupyter notebook 默认把文件夹
  • 会声会影2024永久破解和谐版下载 包含激活码序列号
  • 深入理解RunLoop
  • 【162天】黑马程序员27天视频学习笔记【Day02-上】
  • 【5+】跨webview多页面 触发事件(二)
  • Angular4 模板式表单用法以及验证
  • Apache的80端口被占用以及访问时报错403
  • fetch 从初识到应用
  • Intervention/image 图片处理扩展包的安装和使用
  • Js实现点击查看全文(类似今日头条、知乎日报效果)
  • mockjs让前端开发独立于后端
  • Odoo domain写法及运用
  • React as a UI Runtime(五、列表)
  • React中的“虫洞”——Context
  • Selenium实战教程系列(二)---元素定位
  • Stream流与Lambda表达式(三) 静态工厂类Collectors
  • XForms - 更强大的Form
  • 分类模型——Logistics Regression
  • 后端_MYSQL
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 警报:线上事故之CountDownLatch的威力
  • 前端之Sass/Scss实战笔记
  • 如何在GitHub上创建个人博客
  • 山寨一个 Promise
  • 优秀架构师必须掌握的架构思维
  • 自动记录MySQL慢查询快照脚本
  • 3月7日云栖精选夜读 | RSA 2019安全大会:企业资产管理成行业新风向标,云上安全占绝对优势 ...
  • ​如何在iOS手机上查看应用日志
  • !!java web学习笔记(一到五)
  • #每日一题合集#牛客JZ23-JZ33
  • #我与Java虚拟机的故事#连载03:面试过的百度,滴滴,快手都问了这些问题
  • (2024,Flag-DiT,文本引导的多模态生成,SR,统一的标记化,RoPE、RMSNorm 和流匹配)Lumina-T2X
  • (AngularJS)Angular 控制器之间通信初探
  • (pojstep1.1.2)2654(直叙式模拟)
  • (层次遍历)104. 二叉树的最大深度
  • (附源码)ssm捐赠救助系统 毕业设计 060945
  • (简单) HDU 2612 Find a way,BFS。
  • (求助)用傲游上csdn博客时标签栏和网址栏一直显示袁萌 的头像
  • (实测可用)(3)Git的使用——RT Thread Stdio添加的软件包,github与gitee冲突造成无法上传文件到gitee
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (五十)第 7 章 图(有向图的十字链表存储)
  • (详细文档!)javaswing图书管理系统+mysql数据库
  • (译)2019年前端性能优化清单 — 下篇