C++(9)——内存管理

news2024/11/17 21:37:31

   

1. 内存分类:

    在前面的文章中,通常会涉及到几个名词,例如:栈、堆。这两个词所代表的便是计算机内存的一部分 。在计算机中,对系统的内存按照不同的使用需求进行了区分,大致可以分为:栈 、堆、数据段、代码段。其各个具体解释如下:
      1. 栈又叫堆栈--非静态局部变量/函数参数/返回值等等,栈是向下增长的。
      2. 堆用于程序运行时动态内存分配,堆是可以上增长的。
      3. 数据段(静态区)--存储全局数据和静态数据。
      4. 代码段(常量区)--可执行的代码/只读常量。

为了更加深入的了解各个内存空间之间的差异,下面给出一个例子:

int globalVar = 1;
static int staticGlobalVar = 1;
void Test()
{
 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);

1. 对于变量globalVar,是一个全局变量,存储在数据段(静态区)。

2.对于变量staticGlobalVar,在定义的时候加上了关键字static,存放在数据段(静态区)。

前两个变量虽然都存储在数据段(静态区),但是二者的链接属性并不相同,对于globalVar,可以在同一工程下的不同文件中共享使用。但是对于staticGlobalVar,只能在本文件中使用。

3. 对于变量staticVar,也是一个被关键字static修饰的静态变量,同样存储在数据段(静态区),但是只能在本函数内部使用。

4.对于变量localVar,是函数内部的一个临时变量,存储在栈区

5.对于变量num1,是一个函数内部的数组,存储在栈区

6.对于变量char2,与变量num1同理,都是存储在

	int* n1 = new int;

栈区上的

7.对于变量*char2,与num1类似,存储在栈区上

8.对于变量pchar3,需要注意,在定义这个变量时,前面的const修饰的并不是pchar3,而是*pchar3。因此,pchar3也是存储在栈区,但是需要注意,*pchar3,即字符串abcd则是存储在代码段(常量区)。

9.对于ptr1,与pchar3类似,也是存储在栈区上的,但是*ptr1,即后面利用malloc开辟的空间是在堆区的。因此*ptr1是存储在堆区上的

2. C++中的内存管理:

2.1 开辟内存空间:

       在C语言中,对于内存的管理通常是使用malloc,realloc,free等函数完成的,在数据结构中,经常在创建一个关于数据结构的单个结点时使用。在C++中,引入了两个关键字new,delete来实现内存管理。其中,new用来开辟内存空间,delete用来释放开辟的内存空间。对于这两个操作符的使用,下面将引入若干例子来说明:
       

       1. 开辟一个类型为int的空间:

int* n1 = new int;

      2.一次性开辟10个类型为int的空间:

int* n1 = new int[10];

     在C语言——动态内存管理:_编写内存管理代码-CSDN博客中提到,对于函数malloc,只能开辟空间,并不能对开辟的空间进行初始化。而函数calloc可以在开辟空间的同时将所开辟的空间初始化为0。对于关键字new,在上面的使用方法中,同样无法完成对于开辟空间的初始化。如果想初始化开辟的空间,例如将开辟的一个类型为int的空间初始化为0,则:
 

int* n2 = new int(0);  //开辟一个类型为Int的空间,初始化为0

运行结果如下:

若需要同时初始化多个空间,则:

int* n3 = new int[10]{ 1,2,3 }; //开辟10个类型为int的空间,并初始化其中三个空间为1,2,3

 运行结果如下:

       不难发现,在上述代码中,开辟了10个空间,但是仅对其中三个进行了初始化。对于其他的空间,默认初始化为0

2.2 释放内存空间:

   针对使用关键字new开辟的内存空间,需要用关键字delete进行删除。对于单个空间的释放,代码如下:

int* n = new int;      //开辟一个空间,类型为int

delete n; //释放上方开辟的空间

对于多个空间的释放,代码如下:
 

int* n1 = new int[10]; //开辟10个类型为int的空间

	delete[]n1;   //释放上面开辟的10个空间

3. 为什么要引入这两个关键字:

    前面说到,new,delete这两个关键字是在C++中引入的,虽然C语言中的函数malloc,calloc,realloc,free已经满足了对于内存的开辟及释放。但是,这些函数针对于自定义类型并不能解决初始化的问题。因此,需要引入newdelete来完成开辟自定义类型空间时的初始化问题。例如对于下方给出的自定义类型:

class A
{
public:
	A(int a = 0)
		:_a(a)
	{
		cout << " A() " << " " << this << endl;
	}

	~A()
	{
		cout << " ~A() " << " " << this << endl;
	}
private:
	int _a;
};

按照上方new开辟空间的方式,来开辟一个类型为A的空间,代码为:

A* n4 = new A;  //开辟一个类型为A的空间

       而针对于new如何对开辟的空间进行初始化。可以认为,在调用关键字new开辟空间时,关键字进行了两步:第一步是开辟空间,第二步则是调用自定义类型的默认构造函数(全缺省、不需要传参就可以调用、编译器自动生成),对于上述代码中的类,由于其构造函数中的参数为全缺省,因此可以看作一个默认构造函数,但运行上方代码时,结果如下:

   通过结果可以得知,在开辟空间时调用了自定义类型A的默认构造函数。 

如果想要显式调用,即不适用类中的构造函数的参数,方法如下:

A* n5 = new A(1);

类中成员变量如下:

上述开辟自定义类型空间只是开辟了一个,对于开辟多个自定义类型的空间,代码如下:

A* n6 = new A[5];

运行结果如下:

 对于开辟多个空间的初始化,有下面几种方法:

A a1(1);
	A a2(2);
	A a3(3);

	A* n7 = new A[3]{ a1,a2,a3 };

 同时,可以借助匿名对象来达成初始化的效果:

A* n8 = new A[3]{A(1), A(2), A(3)};

此外,如果自定义类型的构造函数满足单参数这一条件

(注:单参数并不准确,具体条件可以在C++类与对象基础(8)-CSDN博客进行查看)

可以借助隐式类型转换来完成初始化,即:

A* n9 = new A[3]{ 4,5,6 };

对于自定义类型空间的释放,代码如下:

	cout << "测试自定义类型空间的释放" << endl;
	A* n9 = new A[3]{ 4,5,6 };

	delete[]n9;

运行结果如下:

不难发现,代码在运行中调用了析构函数。原因是对于关键字delete,其动作过程也可以分为两步: 调用自定义类型的析构函数、释放空间。

4. 勘误:

  由于个人能力有限,书中难免出现汉字拼写错误、代码意义解释错误、内容逻辑以及理解错误等不同类型的错误。首先感谢各位大佬能花掉自己宝贵的时间阅读此文章,愿大佬们斧正,发现错误可以通过私信联系,本人不胜感激。

 

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

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

相关文章

平均预期寿命可视化

完整地址&#xff1a; 一键三连感谢您的观看 https://www.bilibili.com/video/BV11V41197Rd/?spm_id_from333.999.list.card_archive.click&vd_sourcee9167c654bb4523338a765358a8ac2af<!DOCTYPE html> <html><head><meta charset"utf-8"…

工程师职称申报业绩是如何要求的?

无论是初级职称还是中级职称或是高级职称&#xff0c;评审的重要条件之一就是相关的业绩证明。 一、个人业绩&#xff0c;比如你做过哪些与本专业相关的业绩证明&#xff0c;像工程类的职称&#xff0c;你的业绩证明就包括中标通知书、竣工验收报告&#xff0c;或是你参与工程建…

脑科学与人工神经网络ANN的发展历程与最新研究

本文深入研究了ANN的基本概念、发展背景、应用场景以及与人脑神经网络的关系。 关注TechLead&#xff0c;分享AI全维度知识。作者拥有10年互联网服务架构、AI产品研发经验、团队管理经验&#xff0c;同济本复旦硕&#xff0c;复旦机器人智能实验室成员&#xff0c;阿里云认证的…

【书生·浦语大模型实战营04】《(4)XTuner 大模型单卡低成本微调实战》学习笔记

《(4)XTuner 大模型单卡低成本微调实战》 课程文档&#xff1a;《XTuner 大模型单卡低成本微调实战》 1 Finetune简介 LLM的下游应用中&#xff0c;增量预训练和指令跟随是经常会用到两种的微调模式 1.1 增量预训练微调 使用场景&#xff1a;让基座模型学习到一些新知识&a…

中本聪15年前剧本重演!“比特币上市首日”成绩斐然,ETF交易量冲破46亿美元!

2024年1月11日&#xff0c;美国证券交易委员会&#xff08;SEC&#xff09;以3-2投票结果批准比特币现货ETF。 2009年1月11日&#xff0c;中本聪向比特币早期开发者哈尔芬尼(Hal Finney)转出10枚比特币&#xff0c;使他成为世界上第一个透过交易获得比特币的人。随后&#xff0…

13个自媒体文库平台(附通道链接)

​划到最后“阅读原文” ——进入官网 Hi&#xff0c;大家好&#xff0c;我是胡猛夫&#xff0c;每天分享实用运营工具&#xff01; 更多内容&#xff0c;更多资源&#xff0c;欢迎交流&#xff01; 公 号 | 微视角文化 》》精彩推荐 >>微视角文化知识库&#xff1a;移…

智汇云舟受邀出席石油化工工程数字化交付研讨会

1月9日&#xff0c;由中国石油和石化工程研究会主办的石油化工工程数字化交付研讨会暨智能化工厂建设运行经验交流会在北京顺利召开。智汇云舟创始人兼总裁周舟受邀出席活动&#xff0c;与来自中国石油、中国石化、中国海油、中国中化等单位的相关专家、领导三百余人共同探讨如…

轻量级图床Imagewheel本地部署并结合内网穿透实现远程访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

最佳实践:如何在 SoapUI 中进行 REST 服务的测试

SoapUI 频繁地被选择为 SOAP 和 REST API 的自动化测试利器&#xff0c;得益于其友好的用户界面&#xff0c;测试人员毫不费力便可校验 REST 和 SOAP 协议的 Web 服务。它尤其适用于那些需要进行复杂测试的场合。 1、设置接口 我利用了 Swagger 去设置了一批即将投入使用的接…

springcloud stream消息驱动

简介 Spring Cloud Stream是一个用于构建基于事件驱动的微服务应用程序的框架&#xff0c;其核心目标是简化开发过程&#xff0c;降低消息通信的复杂性&#xff0c;从而使开发人员能够专注于编写业务逻辑。Spring Cloud Stream通过提供Binder抽象&#xff0c;将应用程序与消息…

基于Java SSM框架实现医院管理系统项目【项目源码】计算机毕业设计

基于java的SSM框架实现医院管理系统演示 SSM框架 当今流行的“SSM组合框架”是Spring SpringMVC MyBatis的缩写&#xff0c;受到很多的追捧&#xff0c;“组合SSM框架”是强强联手、各司其职、协调互补的团队精神。web项目的框架&#xff0c;通常更简单的数据源。Spring属于…

自定义View示例

目录 1.继承View重写onDraw方法 2.继承View重写onMeasure方法 3.添加自定义属性 4.完整代码&#xff1a; 1.继承View重写onDraw方法 解决问题&#xff1a;直接继承自View和ViewGroup的控件&#xff0c;padding是默认无法生效的&#xff0c;需要自己处理。 Overrideprotect…

组合和聚合

不是c的语法要求&#xff0c;是一种建模思想 目录 1.组合 1. 使用 -- 在一个类中创建另外一个类的对象 代码中的解释: 代码结果&#xff1a; 组合&#xff1a; 2. 使用 -- 在一个类中创建另外一个类的指针 2.使用类定义一个指针 -- 不是创建一个对象 3.聚合 1. 使…

世微AP5125 输入14-80V 输出12V5A LED灯降压恒流电源驱动方案 SOT23-6

这是一款60WLED驱动方案,线路图BOM表如下 ​ 祥单表&#xff1a; 实物图&#xff1a; 产品描述 AP5125 是一款外围电路简单的 Buck 型平均电流检测模式的 LED 恒流驱动器&#xff0c;适用于 8-100V 电压范围的非隔离式大功率恒流 LED 驱动领域。芯片采用固定频率 140kHz 的 …

与建设者同行:TinTinLand 社区 2023 年度回顾

2023 是 Web3 行业不同寻常的一年&#xff0c;也是 TinTinLand 社区高速发展的一年&#xff1a;我们精心提供最有价值的内容&#xff0c;举办一系列丰富多样的活动&#xff0c;开设氛围友好的区块链技术课程&#xff0c;为尚不了解 Web3 的开发者等各领域人才&#xff0c;构建颇…

小程序必看系列!什么是抖音小程序?抖音小程序怎么制作?

随着移动互联网的飞速发展&#xff0c;抖音已经成为了一个广受欢迎的短视频平台。在这个平台上&#xff0c;用户可以分享自己的生活点滴、表达自己的观点&#xff0c;甚至还能通过小程序来丰富自己的社交体验。那么&#xff0c;如何制作抖音小程序呢&#xff1f; 一、抖音小程…

清水模板厂家专供 — 易脱模,不翘曲

在现代建筑施工中&#xff0c;清水模板的选择对于实现优质建筑表面尤为关键。我们专供的清水模板&#xff0c;凭借其易脱模和不翘曲的特性&#xff0c;为建筑项目提供了理想的解决方案。 产品特点 易脱模性能&#xff1a;我们的清水模板表面光滑细腻&#xff0c;经过特殊处理…

知识库软件有很多,这几个最好用

时代进步的同时&#xff0c;逐渐优化的企业知识库已经成为企业优化工作效率、提升企业竞争力的重要工具。随着云计算和大数据技术的快速发展&#xff0c;知识库软件如雨后春笋般出现在人们的视野中。下面&#xff0c;我从寻宝者的角度&#xff0c;向大家稳稳地推荐三款最优秀的…

电动工具直流调速专用集成电路GS069,具有电源电压范围宽、功耗小、抗干扰能力强等特性

GS069电动工具直流调速电路是CMOS专用集成电路&#xff0c;具有电源电压范 围宽、功耗小、抗干扰能力强等特点。通过外接电阻网络&#xff0c;改变与之相接 的VMOS 管的输出&#xff0c;达到控制电动工具转速的作用。该电路输出幅值宽&#xff0c; 频率变化小&#xff0c;占空比…

SQL-DML增删改

&#x1f389;欢迎您来到我的MySQL基础复习专栏 ☆* o(≧▽≦)o *☆哈喽~我是小小恶斯法克&#x1f379; ✨博客主页&#xff1a;小小恶斯法克的博客 &#x1f388;该系列文章专栏&#xff1a;重拾MySQL &#x1f379;文章作者技术和水平很有限&#xff0c;如果文中出现错误&am…