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

一、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的区别

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI-数学-高中-43常见函数的导数

原作者视频:【导数】【一数辞典】2常见函数的导数_哔哩哔哩_bilibili

【C++】——类和对象(构造函数,析构函数,拷贝构造函数,赋值运算符重载)

创作不易,多多支持! 前言 相信你对这几个知识点有点混淆,相信看完以后,你会对此有一个清晰的认识。 一 类的6个默认成员函数 如果我们写一个类,但是类里面什么都没有,我们称之为空类。 其实这个类也不…

AWS SES发送邮件如何正确配置?操作指南?

AWS SES发送邮件有哪些限制?AWS SES发信的注意事项? AWS SES作为亚马逊云服务提供的一项高效、可靠的电子邮件发送服务,受到了众多企业的青睐。然而,如何正确配置AWS SES发送邮件。AokSend将详细解析AWS SES发送邮件的配置过程&a…

《苍穹外卖》Day07部分知识点记录

一、菜品缓存 减少查询数据库的次数,优化性能 客户端: package com.sky.controller.user;import com.sky.constant.StatusConstant; import com.sky.entity.Dish; import com.sky.result.Result; import com.sky.service.DishService; import com.sky…

搜维尔科技:如何选择最佳的xsens动作捕捉设备

xsens介绍 如何选择最佳的xsens动作捕捉设备 选择最佳的 Xsens 动作捕捉设置并不总是像我们希望的那样简单。根据每个人的情况,会有不同的选择、要求和挑战。 这就是我们创建此博客的原因:帮助您做出最适合您的决定。 您已经决定继续使用 Xsens 了吗…

电表抄表系统:现代能源管理的革新

1.界定和功能 电表抄表系统是一种前沿的自动化控制,用以远程控制搜集、解决与分析电表数据。它取代了传统的人工抄水表方法,提高了效率,降低了不正确,并且为供电公司带来了实时能源消耗信息。系统软件的主要作用包含全自动载入电…

大模型实战—通义千问大模型微调

通义千问大模型微调 在之前的文章中,我分享了一些使用大语言模型开发应用的方法,也介绍了几个开源大语言模型的部署方式, 有同学给我留言说想知道怎么训练自己的大语言模型,让它更贴合自己的业务场景。完整的大语言模型训练成本…

第十五届蓝桥杯省赛第二场PythonB组A题【进制】题解(AC)

解题思路 按照题意进行模拟,计算 x x x 的 b b b 进制过程中,若出现余数大于 9 9 9,则说明 x x x 的 b b b 进制一定要用字母进行表示。 x 8100178706957568def check(x, b):while x:if x % b > 10:return Falsex // breturn True…

Flink的安装、项目创建、任务打包和部署完整实现,任务实现使用JAVA语言

Flink资源下载地址 Flink安装包下载地址 一、本地模式安装Flink 1、在Linux服务上,创建flink文件夹 mkdir flink 2、上传文件并解压 tar -zxvf flink-1.14.6-bin-scala_2.11.tgz 解压完成后,如图: 3、启动Flink 进入到解压目录下&#x…

男士休闲裤比较好的品牌有哪些?高品质休闲男装推荐

穿衣服最重要的并不是要求多好看多时尚,相信绝大部分年纪在23岁以上的男同胞们更希望穿一些简约好搭配的款式,更重要的其实就是要求质量耐穿,以及有足够好的舒适性。 但是现在市面上的品牌实在是太多了,而且质量也参差不齐&#x…

【保姆级讲解下gateway基本配置】

🎥博主:程序员不想YY啊 💫CSDN优质创作者,CSDN实力新星,CSDN博客专家 🤗点赞🎈收藏⭐再看💫养成习惯 ✨希望本文对您有所裨益,如有不足之处,欢迎在评论区提出…

pwn--realloc [CISCN 2019东南]PWN5

首先学习一下realloc这个函数,以下是文心一言的解释: realloc是C语言库函数之一,用于重新分配内存空间。它的主要功能是调整一块内存空间的大小。当需要增加内存空间时,realloc会分配一个新的更大的内存块,然后将原内…

QT从入门到实战x篇_22_番外1_Qt事件系统

文章目录 1. Qt事件系统简介1.1 事件的来源和传递1.2 事件循环和事件分发1.2.1 QT消息/事件循环机制1.2.1.1 机制解释1.2.1.2 两个问题 1.2.2 事件分发 2. 事件过滤基础2.1 什么是事件过滤器(Event Filter)?2.2 如何安装事件过滤器 3. 事件过…

《QT实用小工具·四十》显示帧率的控件

1、概述 源码放在文章末尾 该项目实现了可以显示帧率的控件&#xff0c;项目demo演示如下所示&#xff1a; 、 项目部分代码如下所示&#xff1a; #ifndef FPSITEM_H #define FPSITEM_H#include <QQuickItem>class FpsItem : public QQuickItem {Q_OBJECTQ_PROPERTY(i…

制作自己的YOLOv8数据集

制作自己的YOLO8数据集 前言 该数据集的格式参照于coco数据集结构✨ 步骤一&#xff1a;收集图像数据 从互联网上下载公开的数据集&#xff0c;也可以使用摄像头或其他设备自行采集图像&#xff0c;确保你的图像数据覆盖了你感兴趣的目标和场景 步骤二&#xff1a;安装Labe…

提升工作效率必备,桌面待办事项提醒软件

在快节奏的现代社会&#xff0c;提升工作效率成为众多上班族的共同追求。有效的时间管理、合理的工作计划和正确的工具选择&#xff0c;是实现高效工作的三大关键。尤其是选择一款优秀的待办事项管理软件&#xff0c;能够极大地助力我们提升工作效率。 而我在网上找到了一款提…

11 - 在k8s官方文档上,经常搜索不到内容的问题

使用k8s官方文档时&#xff0c;会出现首页可以正常打开&#xff0c;但是输入搜索关键字之后&#xff0c;搜索不到内容的情况&#xff0c;如下图&#xff1a; 这是由于相关搜索组件被墙的原因&#xff0c;处理方法如下&#xff1a; 谷歌浏览器&#xff1a; 火狐浏览器&#x…

AI大模型重塑新媒体变现格局:智能写作技术助力腾飞!

文章目录 一、AI大模型&#xff1a;新媒体变革的引擎二、智能写作&#xff1a;内容生产的新范式三、精准推送&#xff1a;增强用户粘性的关键四、新媒体变现&#xff1a;插上AI翅膀的飞跃五、挑战与机遇并存&#xff1a;AI与新媒体的未来展望AI智能写作: 巧用AI大模型让新媒体变…

智慧园区引领未来产业趋势:科技创新驱动园区发展,构建智慧化产业新体系

目录 一、引言 二、智慧园区引领未来产业趋势 1、产业集聚与协同发展 2、智能化生产与服务 3、绿色可持续发展 三、科技创新驱动园区发展 1、创新资源的集聚与整合 2、创新成果的转化与应用 3、创新文化的培育与弘扬 四、构建智慧化产业新体系 1、优化产业布局与结构…

鸿蒙OpenHarmony【集成三方SDK】 (基于Hi3861开发板)

OpenHarmony致力于打造一套更加开放完善的IoT生态系统&#xff0c;为此OpenHarmony规划了一组目录&#xff0c;用于将各厂商的SDK集成到OpenHarmony中。本文档基于Hi3861开发板&#xff0c;向平台开发者介绍将SDK集成到OpenHarmony的方法。 规划目录结构 三方SDK通常由静态库…