100 C++内存高级话题 new 细节探秘,重载类内 operator new ,delete

news2024/10/5 12:53:10

一 new 内存分配细节探秘

我们以分配10个char为例,说明,观察内存发现,当delete 的时候,实际上很多内存都改变了。

实际上 new 内存不是一个简单的事情。为了记录和管理分配出去的内存,额外分配了不少内存,造成了浪费。尤其是多次申请小块的内存,浪费更严重。

不同的编译器对于这块实现是不同的。

但是功能都是大同小异的,要管理 分配出去的内存,考虑效率等。

二 重载类中的 operator new 和 operator delete 操作符

前提

从前面的知识我们知道:当你new Teacher后,主要代码逻辑如下:

Teacher *ptea = new Teacher;

        operator new();

                malloc();

        Teacher::Teacher();

-----------------------------------------

delete ptea;

        Teacher::~Teacher();

        operator delete();

                free();

思路

我们这里就是要重写operator new()方法,C++编译器在operator new()方法中调用了 malloc()方法分配内存。因此我们重写时也需要malloc内存。

我们这里就是要重写operator delete()方法,C++编译器在operator delete()方法中调用了 free()释放内存。因此我们重写时也需要free内存。

写法

    static void* operator new(size_t size) {
        Teacher35* ppoint = (Teacher35 *)malloc(size);
        return ppoint;
    }
    static void operator delete(void *phead) {
        free(phead);
    }

class Teacher35 {
public:
	Teacher35() {
		cout << "Teacher35 gouzao fangfa " << endl;//3
	}

	~Teacher35() {
		cout << "Teacher35 xigou" << endl;//5
	}

	//static void* operator new(size_t size) {
	//	Teacher35* ppoint = (Teacher35 *)malloc(size);//2. 在teacher35有一个int的时候,size是4
	//	return ppoint;
	//}
	//static void operator delete(void *phead) {
	//	free(phead);//6
	//}
	static void* operator new(size_t size);
	static void operator delete(void *phead);

	int mage;
};
void* Teacher35::operator new(size_t size) {
	Teacher35* ppoint = (Teacher35 *)malloc(size);
	return ppoint;
}

void Teacher35::operator delete(void *phead) {
	free(phead);
}

void main() {
	Teacher35 *ptea = new Teacher35; //1
	cout << "111" << endl;
	delete ptea; //4
	cout << "222" << endl;
}

三 重载类中的 operator new[] 和 operator delete[] 操作符

class Teacher35 {
public:
	Teacher35() {
		cout << "Teacher35 gouzao fangfa " << endl;//3
	}

	~Teacher35() {
		cout << "Teacher35 xigou" << endl;//5
	}

	static void* operator new(size_t size) {
		Teacher35* ppoint = (Teacher35 *)malloc(size);//2. 在teacher35有一个int的时候,size是4
		return ppoint;
	}
	static void operator delete(void *phead) {
		free(phead);//6
	}
	//static void* operator new(size_t size);
	//static void operator delete(void *phead);

	static void* operator new[](size_t size) {
		Teacher35* ppoint = (Teacher35 *)malloc(size);//2. 在teacher35[3]的时候,加上4个字节,这4个字节 存储的是3,因此 size 大小是 3个teacher的大小 = 3*sizeof(Teacher)+ 4个字节 记录几个teacher(也就是3)
		return ppoint;
	}
	static void operator delete[](void *phead) {
		free(phead);//6
	}


	int mage;
};
//void* Teacher35::operator new(size_t size) {
//	Teacher35* ppoint = (Teacher35 *)malloc(size);
//	return ppoint;
//}
//
//void Teacher35::operator delete(void *phead) {
//	free(phead);
//}

void main() {
	//Teacher35 *ptea = new Teacher35; //1
	//cout << "111" << endl;
	//delete ptea; //4
	//cout << "222" << endl;

	Teacher35 *ptea = new Teacher35[3];

	delete[] ptea;
}

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

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

相关文章

clickhouse行转列的转换

1、原表select * from test 2、一个人的每个科目作为一行记录 改为一个人的所有科目作为一行记录 方式1 select name, sum(case when subject‘语文’ then score else 0 end) as chinese, sum(case when subject‘数学’ then score else 0 end) as math from test group by …

Redis学习——高级篇⑨

Redis学习——高级篇⑨ Redis7高级之Redlock算法和Redisson的使用&#xff08;十&#xff09; 10.1 Redlock 红锁算法1.解决手写分布式锁的单点故障问题2.设计理念3. 解决方案 10.2 Redisson进行代码改造10.3 多机案例&#xff08;解决单点故障&#xff09;10.4 R…

线性代数:矩阵的秩

目录 一、矩阵的子式 二、矩阵的秩 三、重要性质定理推论 一、矩阵的子式 二、矩阵的秩 三、重要性质定理推论

Linux多线程服务端编程:使用muduo C++网络库 学习笔记 第十一章 反思C++面向对象与虚函数(下)

11.7.2 值语义与生命期 值语义的一个巨大好处是生命期管理很简单&#xff0c;就跟int一样——你不需要操心int的生命期。值语义的对象要么是stack object&#xff0c;要么直接作为其他object的成员&#xff0c;因此我们不用担心它的生命期&#xff08;一个函数使用自己stack上…

TryHackMe-File Inclusion练习

本文相关的TryHackMe实验房间链接&#xff1a;TryHackMe | Why Subscribe 路径遍历(目录遍历) LocationDescription/etc/issue包含要在登录提示之前打印的消息或系统标识。/etc/profile控制系统范围的默认变量&#xff0c;例如导出&#xff08;Export&#xff09;变量、文件创…

纯国产,3款黑科技软件,被误认为外国佬开发

闲话不多说&#xff0c;直接为大家推荐三款实用工具。 1、知犀思维导图 这款国产的思维导图工具&#xff0c;堪称业界的良心之选。它不仅能捕捉你每一个稍纵即逝的灵感&#xff0c;而且界面简洁、操作轻松。无论是团队协作、灵感记录、规划制定&#xff0c;还是日常笔记&…

jenkins添加linux节点

jenkins添加linux节点并创建任务_创建linux jenkins结点-CSDN博客文章浏览阅读1.1k次。jenkins添加linux节点并创建任务_创建linux jenkins结点https://blog.csdn.net/qq_32828053/article/details/128905581

加速知识检索:伯克利DeepMind联合研究,RaLMSpec让语言模型服务飞速提升2-7倍!

近年来&#xff0c;随着大型语言模型&#xff08;LLM&#xff09;的出现&#xff0c;在多样化的 NLP 任务上取得了令人瞩目的成果。然而&#xff0c;知识密集型任务仍是 NLP 领域中的一项挑战&#xff0c;因为这些任务不仅要求模型要理解和生成自然语言&#xff0c;还要能够访问…

【论文笔记】Multi-Chain Reasoning:对多思维链进行元推理

目录 写在前面1. 摘要2. 相关知识3. MCR方法3.1 生成推理链3.2 基于推理链的推理 4. 实验4.1 实验设置4.2 实验结果 5. 提及文献 写在前面 文章标题&#xff1a;Answering Questions by Meta-Reasoning over Multiple Chains of Thought论文链接&#xff1a;【1】代码链接&…

江科大stm32学习笔记11——旋转编码器计次

一、接线 旋转编码器&#xff0c;旋钮会不断接触断开触点产生电波。 由于两个电波之间相差90&#xff0c;即为正交波&#xff0c;一个电波处于高电平时另一个处于低电平&#xff0c;所以可以用来判断旋转方向。 二、代码 复制粘贴4-1的工程文件&#xff0c;重命名为“5-2 旋转…

Could not resolve host: github.com问题解决

git clone的时候发现机器无法解析github.com&#xff0c;其实应该改用ssh协议去clone&#xff0c;但是我用的是公用的机器&#xff0c;密钥对一直没配置好&#xff0c;所以也就堵死了。那么如果想让机器能解析github.com&#xff0c;&#xff08;机器本身没有ping命令&#xff…

深度学习入门笔记(五)前馈网络与反向传播

接着上一节,本节讲解模型自我学习的数学计算过程究竟是怎么样的。 5.1 前馈网络 一个最简单的前馈神经网络如图所示,对于每一个隐藏层,输入对应前一层每一个节点权重乘以节点输出值,输出则是经过激活函数(例如sigmoid函数)计算后的值。 在这样的网络中,输入的数据 x 经…

数据结构—基础知识(16):哈夫曼编码

数据结构—基础知识&#xff08;16&#xff09;&#xff1a;哈夫曼编码 哈夫曼编码的主要思想 在进行数据压缩时&#xff0c;为了使压缩后的数据文件尽可能短&#xff0c;可采用不定长编码。其基本思想是&#xff1a;为出现次数较多的字符编以较短的编码。为确保对数据文件进…

一、创建Vue3项目

1. 下载 node.js 下载地址&#xff1a;https://nodejs.org/zh-cn 优先选择 16 版本; node -v || node -version 可以检查本地 node.js 版本 2. 设置淘宝镜像源 npm config set registry https://registry.npmmirror.com/ 设置淘宝镜像源 npm config get registry 查看当前镜像…

【GitHub项目推荐--一款100% 开源的物联网开发平台,匹配智慧城市、智能家居和能源管理】【转载】

OpenRemote 一款100% 开源 - 集成您的设备、创建规则以及分析和可视化您的数据的物联网设备管理平台 github地址&#xff1a; https://github.com/openremote/openremote 国内源代码&#xff1a; http://www.gitpp.com/pythonking/openremote OpenRemote 的介绍 OpenRemo…

格式化内存卡后,如何找回丢失的监控视频?

随着摄像头的应用越来越广泛&#xff0c;很多监控摄像头采用了内存卡作为存储介质&#xff0c;方便用户存储和查看摄像头拍摄的视频文件。然而&#xff0c;由于各种原因&#xff0c;监控摄像头的内存卡有时会被意外格式化导致重要数据的丢失&#xff0c;给用户带来诸多困扰。 那…

因子图、边缘化与消元算法的抽丝剥茧 —— Notes for “Factor Graphs for Robot Perception“

Title: 因子图、边缘化与消元算法的抽丝剥茧 —— Notes for “Factor Graphs for Robot Perception” 文章目录 I. 前言II. 因子图的基本概念1. 因子图的定义2. SLAM 中的因子图A. 因子图的图示B. 因子图的因式C. 因子图的二分图形式 III. 边缘化与消元运算的基本原理1. 边缘化…

19. 删除链表的倒数第 N 个结点(力扣LeetCode)

文章目录 19. 删除链表的倒数第 N 个结点题目描述将删除倒数第n个节点转化为删除第n个节点双指针 19. 删除链表的倒数第 N 个结点 题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;hea…

LeetCode_17_中等_电话号码的字母组合

文章目录 1. 题目2. 思路及代码实现&#xff08;Python&#xff09;2.1 回溯 1. 题目 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。 给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应…

中国(合一)民营企业家高峰论坛暨2024精英校友会10周年庆在上饶举行!

1月29日下午&#xff0c;“中国&#xff08;合一&#xff09;民营企业家高峰论坛暨2024精英校友会10周年庆典”在上饶市饶商金茂诚悦酒店举行。出席会议的嘉宾有民建上饶市委会专职副主委方乾文、民建上饶市委会秘书长尹林、上饶市民营&#xff08;个私)经济协会会长傅利平、上…