【C++】5.C语言/C++内存管理

news2025/1/17 15:33:06

一、C/C++内存分布   

                     栈中存储的是局部变量,函数参数,返回值等

        堆主要用于动态内存分配

        数据段用以存储全局数据和静态数据

        代码段存储可执行代码和常量

二、C语言和C++中的内存管理方式

        在C语言中,我们使用 malloc、calloc、realloc、free来进行动态内存管理。而在C++中这些方法仍可以继续使用,但是在面对自定义类型对象的创建时显得无能为力了,因此C++引入了new和delete操作符

        2.1、内置类型的内存管理 

int main()
{
	int* a = new int;//创建整型变量a
	delete a;
	int* b = new int(5);//创建整型变量b,并初始化为5
	delete b;
	int* arr = new int[10] {0,1,2};//创建整型数组,并将其初始化
	delete[] arr;	
	return 0;
}

        2.2、自定义类型的内存管理

        在内置类型中,C语言的malloc和free与C++中的new和delete使用起来差别并不大。但是在自定义类型中,new和delete就很重要了。原因就在于,在自定义类型中,new和delete可以分别调用构造函数和析构函数来对对象完成初始化和资源清理。

int main()
{
	// new / delete 和 malloc / free最大区别是 new / delete对于【自定义类型】除了开空间还会调用构造函数和析构函数
	A* p1 = (A*)malloc(sizeof(A));
	A* p2 = new A(1);
	free(p1);
	delete p2;
	// 内置类型是几乎是一样的
	int* p3 = (int*)malloc(sizeof(int)); // C
	int* p4 = new int;
	free(p3);
	delete p4;
	A* p5 = (A*)malloc(sizeof(A) * 10);
	A* p6 = new A[10];
	free(p5);
	delete[] p6;

	return 0;
}

三、operator new与operator delete函数

        new和delete是用户进行动态内存申请和释放的操作符,operator new 和operator delete是系统提供的全局函数,new在底层调用operator new全局函数来申请空间,delete在底层通过operator delete全局函数来释放空间。

具体的源码如下

/*
operator new:该函数实际通过malloc来申请空间,当malloc申请空间成功时直接返回;
申请空间失败,尝试执行空间不足应对措施,
如果改应对措施用户设置了,则继续申请,否则抛异常。
*/

void *__CRTDECL operator new(size_t size) _THROW1(_STD bad_alloc)
{
     // try to allocate size bytes
     void *p;
     while ((p = malloc(size)) == 0)
         if (_callnewh(size) == 0)
         {
             // report no memory
             // 如果申请内存失败了,这里会抛出bad_alloc 类型异常
             static const std::bad_alloc nomem;
             _RAISE(nomem);
         }
     return (p);
}
/*
operator delete: 该函数最终是通过free来释放空间的
*/
void operator delete(void *pUserData)
{
     _CrtMemBlockHeader * pHead;
     RTCCALLBACK(_RTC_Free_hook, (pUserData, 0));
     if (pUserData == NULL)
         return;
     _mlock(_HEAP_LOCK);  /* block other threads */
     __TRY
         /* get a pointer to memory block header */
         pHead = pHdr(pUserData);
          /* verify block type */
         _ASSERTE(_BLOCK_TYPE_IS_VALID(pHead->nBlockUse));
         _free_dbg( pUserData, pHead->nBlockUse );
     __FINALLY
         _munlock(_HEAP_LOCK);  /* release other threads */
     __END_TRY_FINALLY
     return;
}
/*
free的实现
*/
#define   free(p)               _free_dbg(p, _NORMAL_BLOCK)

可以了解到operator new 实际也是通过malloc来申请空间,如果 malloc申请空间成功就直接返回,否则执行用户提供的空间不足应对措施,如果用户提供该措施就继续申请,否则就抛异常。operator delete 最终是通过free来释放空间的

        总之,我们要严格使用并配对。

四、new和delete的实现原理

        在内置类型的实现上与malloc和free几乎一样,不同的地方是: new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申 请空间失败时会抛异常,malloc会返回NULL。

        但是在自定义类型中:

        1)new的原理 1. 调用operator new函数申请空间 2. 在申请的空间上执行构造函数,完成对象的构造

        2)delete的原理 1. 在空间上执行析构函数,完成对象中资源的清理工作 2. 调用operator delete函数释放对象的空间

        3)new T[N]的原理 1. 调用operator new[]函数,在operator new[]中实际调用operator new函数完成N个对象空间的申请  2. 在申请的空间上执行N次构造函数

        4)delete[]的原理 1. 在释放的对象空间上执行N次析构函数,完成N个对象中资源的清理 2. 调用operator delete[]释放空间,实际在operator delete[]中调用operator delete来释放空间

五、malloc/free和new/delete的区别

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

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

相关文章

理解与使用Linux设备树编译器(DTC)

这里写目录标题 设备树简介设备树编译器(DTC)安装DTC使用DTC实例:编辑设备树小结参考资料 Linux设备树编译器(DTC)是一个关键工具,用于处理嵌入式Linux系统中的设备树文件。本文将介绍设备树的概念、DTC的基…

深入理解 Srping IOC

什么是 Spring IOC? IOC 全称:Inversion of Control,翻译为中文就是控制反转,IOC 是一种设计思想,IOC 容器是 Spring 框架的核心,它通过控制和管理对象之间的依赖关系来实现依赖注入(Dependenc…

每日一题:托普利茨矩阵

给你一个 m x n 的矩阵 matrix 。如果这个矩阵是托普利茨矩阵,返回 true ;否则,返回 false 。 如果矩阵上每一条由左上到右下的对角线上的元素都相同,那么这个矩阵是 托普利茨矩阵 。 示例 1: 输入:matrix…

最新windows版本erlang26.0和rabbitmq3.13下载

Erlang下载 官网下载:https://www.erlang.org/patches/otp-26.0 百度网盘:https://pan.baidu.com/s/1xU4syn14Bh7QR-skjm_hOg 提取码:az1t RabbtitMQ下载 官网下载:https://www.rabbitmq.com/docs/install-windows 百度网盘…

【C++题解】1302. 是否适合晨练?

问题:1302. 是否适合晨练? 类型:分支 题目描述: 夏天到了,气温太高,小明的爷爷每天有晨练的习惯,但有时候温度不适合晨练;小明想编写一个程序,帮助爷爷判断温度是否适合…

同一工程中不同RS的问题结论

目录 MeshDevice/deviceAll && /wvp/device ​编辑 故意改成mesh下的RS,结果包裹了: sys2/redishealth ​编辑 ​编辑 原因解析 MeshDevice/deviceAll && /wvp/device 测试结果:都使用 import com.gbcom.wvp.domain.vo.RS; 返…

C语言编程题_3D接雨水

接雨水的题目描述如下。 (1) 2D接雨水: 字节员工是不是个个都会接雨水 ; (2) 3D接雨水: 407. 接雨水 II ; (3) 3D接雨水: 字节人都会的 3D接雨水 。 问题描述 难度:困难 给你一个 m x n 的矩阵&#xff…

【历史版本火狐浏览器下载】

历史版本火狐浏览器下载 介绍 火狐浏览器是一款开源的互联网浏览器,由Mozilla基金会开发。它的历史版本可以追溯到2002年,以下是一些重要的历史版本介绍: Firefox 1.0(2004年)- 这是火狐浏览器的第一个正式版本&…

安装多个MySQL版本时如何连接到不同的数据库

当安装多个版本的数据库时,不同版本的端口名不一样,可以使用以下命令进行连接 mysql -uroot -p数据库密码 -h主机名 -P端口号 数据库主机名默认是localhost,端口号默认是3306,当安装多个版本数据库时,需要记住数据库的…

vim+xxd 编辑16进制

1. vim -b mib 2. 在vim 中执行 %!xxd, 这样就可以输入16进制: 3. 输入完成后,在vim中 执行 %!xxd -r 切换至原模式; 4. 保存退出即可 5. 重新打开mib文件:vim -b mib 6. 在vim 中执行 %!xxd, 查看是否符合预期:…

java 语法中的数据类型

Java有哪些数据类型? Java语言数据类型分为两种:基本数据类型和引用数据类型。 Java基本数据类型范围和默认值: 需要注意一下,对于布尔类型: 如果 boolean 是单独使用(在编译之后使用 Java 虚拟机中的 int…

民航电子数据库:报错merge sql error, dbType null, druid-1.1.9, sql : xxx

目录 一、场景二、SQL三、报错信息四、排查五、原因六、解决 一、场景 1、对接民航电子数据库 2、limit查询时报错 二、SQL SELECT openid,headimgurl,nickname FROM t_mb_weixinuser WHERE openid? AND vdnId ? LIMIT 1三、报错信息 merge sql error, dbType null, dru…

一觉醒来 AI科技圈发生的大小事儿 04月24日

该日报由AI生成,制作方法联系 【微信:wenhaofree】 ⏩昆仑万维23年收入49亿净利润13亿,研发费用增长40%,坚定All in AGI与AIGC 昆仑万维发布2023年年度业绩报告,实现营业收入49.2亿元,净利润12.6亿元,同比…

学习Rust的第17天:Traits

Rust traits,包括自定义trait声明,trait边界,实现trait的返回类型,条件方法实现和blanket实现。Rust的多态性严重依赖于traits,这允许基于trait的分派和泛型编程。掌握traits使开发人员能够创建灵活的、可维护的代码&a…

Unity射线实现碰撞检测(不需要rigbody组件)

使用physic.CapsulCast(); 前面3个参数生成一个胶囊体, 向着发射方向,发射出一串的胶囊(没有最大距离) 有最大距离,可以节约性能开销。 physic.CapsulCast(&#xff0…

BUUCTF---misc---[ACTF新生赛2020]outguess

1、下载附件,解压之后得到下面信息 2、查看图片属性,发现有个核心价值观编码;解码为abc 3、flag.txt提示 4、结合题目,这是一个outguess隐写 5、用kali先下载安装隐写库 6、使用命令-k(密钥);-r(将图片里面的隐写信息…

数据结构练习-线性表定义与基本操作

----------------------------------------------------------------------------------------------------------------------------- 1. 线性表是( )。 A.一个有限序列,可以为空 B. 一个有限序列,不可以为空 C. 一个无限序列,可以为空…

(SH) HS-PEG-Cy5.5/CY7/CY5 巯基聚乙二醇Cy5.5/Cy7/Cy5

(SH) HS-PEG-Cy5.5/CY7/CY5 巯基聚乙二醇Cy5.5/Cy7/Cy5 【中文名称】花菁染料Cy5.5-聚乙二醇-巯醇 【英文名称】Cy5.5-PEG-SH 【结 构 】 【品 牌】碳水科技(Tanshtech) 【纯 度】95%以上 【保 存】-20℃ 【规 格】5mg,10m…

替换windows11 c:/windows/system32/下的dll

找到注册表中的这一项 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\icssvc\Settings 添加 WifiMaxPeers dword 值 32位 最大值是128 设置完成后重启icssvc服务 sc stop icssvc sc start icssvc 由于win11不小心装了preview版本,貌似这个8个最大的已经限定…

冯唐成事心法笔记 —— 知智慧

系列文章目录 冯唐成事心法笔记 —— 知己 冯唐成事心法笔记 —— 知人 冯唐成事心法笔记 —— 知世 冯唐成事心法笔记 —— 知智慧 文章目录 系列文章目录PART 4 知智慧 知可为,知不可为大势不可为怎么办为什么人是第一位的多谈问题,少谈道理用金字塔…