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

server/2024/10/20 10:14:21/

🌈 个人主页:白子寰
🔥 分类专栏:C++打怪之路,python从入门到精通,数据结构,C语言,C语言题集👈 希望得到您的订阅和支持~
💡 坚持创作博文(平均质量分82+),分享更多关于深度学习、C/C++,python领域的优质内容!(希望得到您的关注~)

目录

前言

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

C/C++ 内存分布

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

malloc

calloc

realloc

free

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

前奏

new/delete 操作内置类型

new/delete 操作自定义类型

new 和 delete 的实现原理

​编辑

定位new表达式


前言

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

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

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




C/C++ 内存分布

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

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

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

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



定位new表达式 

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

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

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

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

 




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

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

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

我是白子寰,如果你喜欢我的作品,不妨你留个点赞+关注让我知道你曾来过。
你的点赞和关注是我持续写作的动力!!! 
好了划走吧。


http://www.ppmy.cn/server/127353.html

相关文章

dijstra算法——单元最短路径算法

Dijkstra算法 用来计算从一个点到其他所有点的最短路径的算法,是一种单源最短路径算法。也就是说,只能计算起点只有一个的情况。Dijkstra的时间复杂度是O(n^2),它不能处理存在负边权的情况。 算法描述: 设起点为s,d…

专访 Bitlayer 联合创始人 Charlie:探索比特币 Layer2 技术的未来

整理:Tia,Techub News 在加密货币行业经历了近 10 年的风雨历程后,Bitlayer 联合创始人 Charlie Hu 凭借其在以太坊、波卡等顶级项目中的深厚经验,重新聚焦比特币生态,他与 Bitlayer 的另外一位联合创始人 Kevin He 通…

如何从硬盘恢复丢失/删除的视频

您是否想知道是否可以恢复已删除的视频? 幸运的是,您可以使用奇客数据恢复从硬盘驱动器、SD 卡和 USB 闪存驱动器恢复已删除的视频文件。 你有没有遇到过这样的情况:当你随机删除文件以释放空间时,你不小心按下了一些重要视频的…

华为昇腾CANN训练营2024第二季--Ascend C算子开发能力认证(中级)题目和经验分享

大家好,我是刘明,明志科技创始人,华为昇思MindSpore布道师。 技术上主攻前端开发、鸿蒙开发和AI算法研究。 努力为大家带来持续的技术分享,如果你也喜欢我的文章,就点个关注吧 正文开始 华为昇腾CANN训练营2024第二季…

Zig开发环境搭建

简介 对于程序员来说,最重要的工具之一代码编辑器,一个好用的开发环境能编程过程无比顺畅丝滑,尤其是在学习Zig 这样的新编程语言时。而Visual Studio Code 开发环境就提供了最简单的设置,可以快速获得代码自动补全和代码生成等功…

k8s集群搭建(保姆级教程以及遇到的各种问题解决)

docker安装 1、移除以前docker相关包 sudo yum remove docker \docker-client \docker-client-latest \docker-common \docker-latest \docker-latest-logrotate \docker-logrotate \docker-engine 2、配置yum源 sudo yum install -y yum-utils sudo yum-config-manager \ …

opencv实战项目(三十):使用傅里叶变换进行图像边缘检测

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 一,什么是傅立叶变换?二,图像处理中的傅立叶变换:三,傅里叶变换进行边缘检测: 一&#xff0c…

【Android】初级控件

像素 Android支持的像素单位有:px(像素)、in(英寸)、mm(毫米)、pt(磅,1/72英寸)、dp(与设备无关的显示单位)、dip(就是dp…