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

news2024/10/6 12:26:15

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

在这里插入图片描述

谢谢

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

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

相关文章

Qt坐标系统

目录 概述 渲染 逻辑表示 锯齿绘制 转换 模拟时钟示例 Window-Viewport转换 概述 坐标系统由QPainter类控制。与QPaintDevice和QPaintEngine类一起,QPainter构成了Qt绘画系统的基础。QPainter用于执行绘制操作,QPaintDevice是一个二维空间的抽象&…

L54--- 404.左叶子之和(深搜)---Java版

1.题目描述 2.思路 递归遍历左子树 ,然后再把左子树的和相加 3.代码实现 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val …

JavaScript之类(1)

class基础语法结构: 代码: class MyClass {constructor() { ... }method1() { ... }method2() { ... }method3() { ... }... } 解释: 属性解释class是我们定义的类型(类)MyClass是我们定义的类的名称 constructor()我们可以在其中初始化对象m…

linux中Java程序调用C程序中方法的实现方式浅析

在Linux中,Java程序可以通过JNI(Java Native Interface)来调用C程序的方法。 Linux系统环境,Java调用C的主要流程如下: 1、创建Java类文件,如NativeLibrary.java 2、编写Java代码,加载.so共享库…

HTTP 状态码详解及使用场景

目录 1xx 信息性状态码2xx 成功状态码3xx 重定向状态码4xx 客户端错误状态码5xx 服务器错误状态码 HTTP思维导图连接:https://note.youdao.com/s/A7QHimm0 1xx 信息性状态码 100 Continue:表示客户端应继续发送请求的其余部分。 使用场景:客…

20240621在飞凌的OK3588-C开发板的Buildroot系统中集成i2ctool工具

20240621在飞凌的OK3588-C开发板中打开i2ctool工具 2024/6/21 17:44 默认继承的i2c工具: rootrk3588-buildroot:/# rootrk3588-buildroot:/# i2c i2c-stub-from-dump i2cdump i2cset i2cdetect i2cget i2ctransfer rootrk3588-…

机器学习第四十四周周报 SAMformer

文章目录 week44 SAMformer摘要Abstract1. 题目2. Abstract3. 网络架构3.1 问题提出3.2 微型示例3.3 SAMformer 4. 文献解读4.1 Introduction4.2 创新点4.3 实验过程 5. 结论6.代码复现小结参考文献 week44 SAMformer 摘要 本周阅读了题为SAMformer: Unlocking the Potential…

开启文物保护新篇章——智能RFID文物藏品库房管理系统

在历史的长河中,文物不仅是见证文明的瑰宝,更是文化传承的重要载体。这些承载着丰富历史和文化价值的珍贵文物,需要得到科学、精细的保护和管理。为了更好地守护和传承我们的文化遗产,我们荣幸地推出智能RFID文物藏品库房管理系统…

(2024,Vision-RWKV,线性复杂度双向注意力,四向标记移位)通过类似 RWKV 的架构实现高效且可扩展的视觉感知

Vision-RWKV: Efficient and Scalable Visual Perception with RWKV-Like Architectures 公和众与号:EDPJ(进 Q 交流群:922230617 或加 VX:CV_EDPJ 进 V 交流群) 目录 0. 摘要 2. 特征聚合机制 3. Vision-RWKV 3.…

怎么看电脑实时充电功率

因为我想测试不同的充电器给电脑充电的速度,所以就想找一款软件可以看电脑当前充电功率的软件,我给一个图 直接搜索就可以下载了,charge rate就是功率,这里是毫瓦,换算单位是 1000mw1w 所以我这里充电功率是65w&…

RocketMQ-记一次生产者发送消息存在超时异常

目录 1、背景说明 2、排查 2.1、防火墙 2.2、超时时间设置 2.3、服务器资源检查 2.3.1、内存、CPU等 2.3.2、磁盘空间 ​编辑 2.3.3、检查文件描述符 2.3.4、swap区 3、增加swap空间 3.1、创建目录 3.2、格式化 3.3、启动swap 3.4、查看效果 1、背景说明 在一次…

音视频开发—FFmpeg 打开摄像头进行RTMP推流

实验平台:Ubuntu20.04 摄像头:普通USB摄像头,输出格式为YUV422 1.配置RTMP服务器推流平台 使用Nginx 配置1935端口即可,贴上教程地址 ubuntu20.04搭建Nginxrtmp服务器) 2.配置FFmpeg开发环境 过程较为简单,这里不…

深度学习Week17——优化器对比实验

文章目录 深度学习Week17——优化器对比实验 一、前言 二、我的环境 三、前期工作 1、配置环境 2、导入数据 2.1 加载数据 2.2 检查数据 2.3 配置数据集 2.4 数据可视化 四、构建模型 五、训练模型 1、将其嵌入model中 2、在Dataset数据集中进行数据增强 六、模型评估 1、Accur…

IMU用于飞行坐姿校正

为了提升长途飞行的舒适度并预防乘客因不良坐姿导致的身体不适,来自荷兰上海两所大学的研究团队携手开发出一种创新的“舒适穿戴”设备,专为识别飞行中的坐姿设计。 研究团队制作了两种原型设备:一种追求极致舒适,另一种为紧身设…

增强-MIGO物料消耗需要将物料描述写到会计凭证的摘要里面

财务比较闲提的需求,有些物料消耗需要将物料描述写到会计凭证的摘要里面, 找了一下增强点,随便搞了一下,可以了。

20240620日志:TAS-MRAM的电阻开放分析

TAS-MRAM的电阻开放缺陷分析 1 MRAM介绍开放电阻的缺陷 1 MRAM介绍 MRAM(Magnetic random access memory),磁随机存储器,利用磁性材料的状态来存储数据。MRAM的存储单元通常由一个磁隧道结( M T J 茅台酒 MTJ^{茅台酒} MTJ茅台酒&#xff0c…

STM32小项目———感应垃圾桶

文章目录 前言一、超声波测距1.超声波简介2.超声波测距原理2.超声波测距步骤 二、舵机的控制三、硬件搭建及功能展示总结 前言 一个学习STM32的小白~ 有问题请评论区或私信指出 提示:以下是本篇文章正文内容,下面案例可供参考 一、超声波测距 1.超声波…

通过 Setapp 使用 240 多款 Mac 生产力工具以及 GPT-4o

Setapp 是一项革命性的订阅服务,可以使用 240 多款 Mac 应用程序的综合套件,并配有强大的人工智能助手。 通过 Setapp 为你的工作效率和生产力增添魔力。 Setapp 官网:访问(提供 7 天试用) Setapp 的主要功能 AI 助手…

人工智能对决:ChatGLM与ChatGPT,探索发展历程

图: a robot is writing code on a horse, By 禅与计算机程序设计艺术 目录 ChatGLM:

数据结构-图的存储结构-邻接矩阵

图的结构十分复杂,不仅各个结点的度不同,各个顶点之间的路径也不尽相同。但是图的主要组成部分比较清晰,分为顶点信息和边或者弧的信息。 邻接矩阵 邻接矩阵就是用一维数组存储图中顶点的信息,用一个二维数组表示图中各个顶点之间…