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 空间寻找符号名,测试如下图:

在这里插入图片描述

谢谢

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/29175.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

双层循环和循环控制语句的使用,while和until的语法使用

双层循环和循环控制语句的使用,while和until的语法使用 exit echo 打印 -n 表示不换行输出 -e 输出转译字符 \b:相当于退格键(backspace) \n:换行,相当于回车 \f:换行,换行后的…

Git仓库中文件的状态

0 Preface/Foreword 1 文件状态 文件包含以下4个状态: untracked,未跟踪,表示该文件在文件夹中,但是没有加入到git 仓库中进行版本管控。可以通过git add命令将该文件增加到git 仓库中。从untracked变为staged。unmodified&…

HarmonyOS之自选股App

支持在 鸿蒙、安卓、苹果设备上运行。 1.界面效果展示 2.数据存储 数据存储采用的是官方的 ohos.data.relationalStore.relationalStore stock_code表用来存储A股市场5000多家公司的股票代码和名称等信息 const TAB_STOCK_CODE "stock_code" const CREATE_TABL…

为企业提供动力:用于大型组织的WordPress

可扩展且灵活的架构可通过主题、插件和集成进行定制内置 SEO 功能和营销功能内容管理和协作工具支持多站点安装托管解决方案和面向平台的提供商采用现代前端技术的 Headless CMS 功能 拥有强大、灵活且可扩展的内容管理系统 (CMS) 对于大型组织至关重要。作为最受欢迎和广泛使用…

双层循环和循环控制语句的使用,以及while和until的语法使用

echo 打印 -n 表示不换行输出 -e 输出转义字符 /b:相当于退格键(backspace) /n: 换行,相当于回车 /f: 换行,换行后的新行的开头连着上一行的行尾 /t: 相当于tab键 又叫做横向制…

springboot与flowable(3):启动、审批、各个Service服务

一、启动流程 流程定义与实例的关系类似于Java的类与对象,通过定义的id创建流程实例,编写测试代码: package org.example.flowabledemo2;import org.flowable.engine.RuntimeService; import org.flowable.engine.runtime.ProcessInst…

Pikachu靶场--XSS

参考借鉴 Pikachu靶场之XSS漏洞详解_pikachu xss-CSDN博客 【皮卡丘03】一个视频讲清楚XSS跨站脚本_bilibili 反射型xss(get) 输入payload&#xff1a;<script>alert(123)</script> 解决一&#xff1a;在URL框内输入 解决二&#xff1a;修改最大长度 再次输入paylo…

【秋招突围】2024届秋招笔试-小红书笔试题-第三套-三语言题解(Java/Cpp/Python)

&#x1f36d; 大家好这里是清隆学长 &#xff0c;一枚热爱算法的程序员 ✨ 本系计划跟新各公司春秋招的笔试题 &#x1f4bb; ACM银牌&#x1f948;| 多次AK大厂笔试 &#xff5c; 编程一对一辅导 &#x1f44f; 感谢大家的订阅➕ 和 喜欢&#x1f497; &#x1f4e7; 清隆这边…

YOLOV1-V3详细介绍(新手向、超详细)

本文主要是根据我自己的学习情况来进行讲解&#xff0c;以一个初学者的角度进行阐释&#xff0c;如果有更深层次的点没有涉及到&#xff0c;还请大家多多包涵。 目录 计算机视觉 主流算法 Two-stage&#xff08;双阶段&#xff09; One-stage&#xff08;单阶段&#xff09; …

Apache Doris 全新分区策略 Auto Partition 应用场景与功能详解 | Deep Dive系列

编辑&#xff1a;SelectDB 技术团队 在当今数据驱动的时代&#xff0c;如何高效、有序地管理数据库中的海量数据成为挑战。为了处理庞大的数据集&#xff0c;分布式数据库引入了类似分区和分桶策略&#xff0c;通过将数据按特定规则划分成较小的单位并分布到不同节点上&#x…

时间序列论文标准数据集

需要的同学私信联系&#xff0c;推荐关注上面图片右下角的订阅号平台 自取下载。 随着时间序列问题的复杂度逐渐提高&#xff0c;研究者们开始关注非线性和多变量问题。近年来&#xff0c;时间序列领域涌现出众多基于深度学习的先进框架&#xff0c;如Transformer、GNN、TCN、…

示例:WPF中TreeView自定义TreeNode泛型绑定对象来实现级联勾选

一、目的&#xff1a;在绑定TreeView的功能中经常会遇到需要在树节点前增加勾选CheckBox框&#xff0c;勾选本节点的同时也要同步显示父节点和子节点状态 二、实现 三、环境 VS2022 四、示例 定义如下节点类 public partial class TreeNodeBase<T> : SelectBindable<…

AI存储解决案例分享

AI数据管道&#xff08;Data Pipeline&#xff09;是指在AI项目中&#xff0c;数据从原始状态到最终可用模型的整个处理流程&#xff0c;包括数据采集、清洗、转换、分析、训练模型、验证模型直至部署和监控等多个环节。 在AI训练和推理过程中&#xff0c;多个管道可能同时读取…

使用 C# 进行面向对象编程:第 10 部分

封装和抽象之间的区别 对于 OOP 初学者来说&#xff0c;封装和抽象之间存在非常基本的区别。他们可能会对此感到困惑。但如果你详细了解这两个主题&#xff0c;就会发现它们之间存在巨大差异。 抽象意味着向用户隐藏不必要的数据。用户只需要所需的功能或根据其需求的输出。例…

修改ppt注册表,导出高分辨率图片

参考&#xff1a;PPT中导出高分辨率图片的方法 修改ppt注册表&#xff0c;导出高分辨率图片&#xff1a;【具体步骤】 1、运行-输入regedit&#xff0c;打开注册表编辑器&#xff1b; 2、找到ppt中选项&#xff0c;按下面路径找。 3、鼠标右键新建-DWORD(32位)(D)&#xff0c…

Python对象复制竟然有这么多种方式,赶紧学起来!

目录 1、浅拷贝:copy模块的copy()函数 📋 1.1 浅拷贝原理揭秘 1.2 实战演示:列表与字典的浅拷贝 列表浅拷贝示例 字典浅拷贝示例 1.3 注意事项:共享引用与独立对象 2、深拷贝:copy模块的deepcopy()函数 📌 2.1 深拷贝实现机制解析 2.2 深拷贝优势分析 2.3 深度…

Hvv--知攻善防应急响应靶机--Linux2

HW–应急响应靶机–Linux2 所有靶机均来自 知攻善防实验室 靶机整理&#xff1a; 夸克网盘&#xff1a;https://pan.quark.cn/s/4b6dffd0c51a#/list/share百度云盘&#xff1a;https://pan.baidu.com/s/1NnrS5asrS1Pw6LUbexewuA?pwdtxmy 官方WP&#xff1a;https://mp.weixin.…

课设--学生成绩管理系统(核心代码部分)

欢迎来到 Papicatch的博客 系统介绍 课设--学生成绩管理系统&#xff08;一&#xff09;-CSDN博客 课设--学生成绩管理系统&#xff08;二&#xff09;-CSDN博客 课设--学生成绩管理系统&#xff08;三&#xff09;-CSDN博客 目录 &#x1f349;内部接口 &#x1f348; 登…

Navicat 安装及初步配置指南

Navicat 是一款广泛使用的数据库管理工具&#xff0c;支持多种数据库&#xff0c;如 MySQL、PostgreSQL、SQLite 等。以下是 Navicat 安装步骤的详细说明&#xff1a; 在 Windows 上安装 Navicat 下载 Navicat 安装包&#xff1a; 访问 Navicat 官方网站&#xff1a;Navicat 官…

第2讲:pixi.js 绘制HelloWorld

基于第0讲和第1讲&#xff0c;我们增添了vite.config.ts文件。并配置了其他的http端口。 此时&#xff0c;我们删除掉没用的东西。 删除 conter.ts、typescript.svg 在main.ts中改成如下内容&#xff1a; import {Application, Text} from pixi.js import ./style.css// 指明…