【C++打怪之路Lv6】-- 内存管理

🌈 个人主页:白子寰

🔥 分类专栏:C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~

💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)

目录

前言

[C 或 C++ 为什么要有内存管理](#C 或 C++ 为什么要有内存管理)

[C/C++ 内存分布](#C/C++ 内存分布)

C语言中动态内存管理方式

malloc

calloc

realloc

free

C++内存管理方式(与C语言对比)

前奏

[new/delete 操作内置类型](#new/delete 操作内置类型)

[new/delete 操作自定义类型](#new/delete 操作自定义类型)

[new 和 delete 的实现原理](#new 和 delete 的实现原理)

​编辑

定位new表达式


前言

C 或 C++ 为什么要有内存管理

C和C++需要内存管理的原因是

为了有效地控制动态内存分配 与回收,防止内存泄漏和野指针 ,确保程序运行效率和稳定性




C/C++ 内存分布

C/C++将这些代码和变量等存在哪?

|-----|-----------------------------------------|
| 代码段 | 存储可执行程序的代码和只读常量 |
| 数据段 | 存储已初始化的全局变量和静态变量 |
| 堆 | 用于程序运行时动态内存分配,从低地址向高地址增长 |
| 栈 | 又叫堆栈,存储非静态局部变量/函数参数和返回值等,从高地址向低地址增长 |

那看看以下staticVar、localVal、char2、pChar3、ptr等存放在哪?

cpp 复制代码
int globalVar = 1;				
static int staticGlobalVar = 1; 

int main()
{
	static int staticVar = 1;		
	int localVar = 1;				

	int num1[10] = { 1, 2, 3, 4 };	
	char char2[] = "abcd";			
	const char* pChar3 = "abcd";	
	int* ptr1 = (int*)malloc(sizeof(int) * 4); 
	int* ptr2 = (int*)calloc(4, sizeof(int));
	int* ptr3 = (int*)realloc(ptr2, sizeof(int) * 4);

	free(ptr1);
	free(ptr3);

	return 0;
}



C语言中动态内存管理方式

具体使用看该篇文章,这里简述保姆级教学 - C语言 之 动态内存管理

malloc

分配内存,开空间


calloc

开空间并初始化


realloc

对开空间的大小进行灵活调整


free

释放动态内存开辟的空间




C++内存管理方式(与C语言对比)

前奏

在学习C语言,我们是怎么开辟新空间和释放掉的?

虽说C++兼容C语言,那来到C++了,还是得升级一下的

那C++是如何申请和释放空间的呢?

new/delete 操作内置类型

小结

malloc 开空间

new 开空间并初始化


new/delete 操作自定义类型




new 和 delete 的实现原理

|------------------|-------------------------------------------------------------|
| new的原理 | (operator new) 申请空间 调用构造 |
| delete的原理 | 调用析构 (operator delete)释放空间 |
| new TN的原理 | (operator new\[\] ->(实际上是operator new))先申请空间,再调用N次构造 |
| delete TN的原理 | 先调用N次析构,再(operator delete\[\] ->(实际上是operator delete))释放空间 |




定位new表达式

定位new表达式允许在已分配的内存上执行构造函数以初始化对象

通常,使用new操作符为对象动态分配内存。

为了优化性能,有时会采用内存池技术,通过malloc分配一大块内存。内存池减少了与堆的交次数,提高了内存分配效率。

对于通过malloc分配的自定义类型内存 ,必须使用定位new来手动调用构造函数。




***********************************************************分割线*****************************************************************************
完结!!!
感谢浏览和阅读。

等等等等一下,分享最近喜欢的一句话:

"相信相信的力量,我就是我自己的神"。

我是白子寰 ,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。

你的点赞和关注是我持续写作的动力!!!

好了划走吧。

相关推荐
码匠许师傅4 小时前
【C++ 面试真题】聊聊 C++ 的移动语义与右值引用
java·c++·面试
2603_965148114 小时前
如何解析JSON数据?API返回的商品信息处理教程
开发语言·数据库·python·自动化·json·api
小小龙学IT5 小时前
DuckDB 深度实战:用 C++ 在进程内跑一个「分析型数据库」
数据库·c++
知无不研6 小时前
lambda表达式的使用(3)
开发语言·c++·lambda
cfm_29147 小时前
SpringAI + Ollama 本地大模型
java·开发语言·人工智能·语言模型
C++ 老炮儿的技术栈8 小时前
基于Qt实现轻量化本地音乐播放器
开发语言·c++·qt·c·播放器·音乐
qq_448011168 小时前
C语言中的柔性数组
c语言·开发语言·柔性数组
小白学大数据8 小时前
长周期爬虫的数据一致性:断点续爬 + 事务回滚保障采集质量
开发语言·爬虫·测试工具
zlinear数据采集卡9 小时前
D223上位机C#开发实战:从帧解析到波形显示的完整实现
开发语言·arm开发·嵌入式硬件·fpga开发·开源·c#
Poo_Chai9 小时前
QT emit信号后完整处理流程,包括槽函数响应流程
java·开发语言·数据库