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

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

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

cpp 复制代码
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 是在已存在的内存地址上直接构造对象。

谢谢

相关推荐
云 无 心 以 出 岫3 分钟前
贪心算法QwQ
数据结构·c++·算法·贪心算法
独好紫罗兰20 分钟前
洛谷题单3-P5719 【深基4.例3】分类平均-python-流程图重构
开发语言·python·算法
换一颗红豆26 分钟前
【C++ 多态】—— 礼器九鼎,釉下乾坤,多态中的 “风水寻龙诀“
c++
篝火悟者34 分钟前
自学-C语言-基础-数组、函数、指针、结构体和共同体、文件
c语言·开发语言
随便昵称1 小时前
蓝桥杯专项复习——前缀和和差分
c++·算法·前缀和·蓝桥杯
commonbelive1 小时前
团体程序设计天梯赛——L1-100 四项全能
c++
genispan1 小时前
QT/C++ 多线程并发下载实践
开发语言·c++·qt
-代号95271 小时前
【JavaScript】十三、事件监听与事件类型
开发语言·javascript·ecmascript
写代码的小王吧2 小时前
【Java可执行命令】(十)JAR文件签名工具 jarsigner:通过数字签名及验证保证代码信任与安全,深入解析 Java的 jarsigner命令~
java·开发语言·网络·安全·web安全·网络安全·jar
小卡皮巴拉2 小时前
【力扣刷题实战】矩阵区域和
开发语言·c++·算法·leetcode·前缀和·矩阵