首页 > 系统相关 >C和C++内存管理

C和C++内存管理

时间:2024-05-26 14:33:08浏览次数:24  
标签:管理 int 申请 C++ 空间 内存 operator new delete

C和C++的内存管理

C/C++中程序内存区域的划分

在这里插入图片描述

  1. 栈又叫堆栈–非静态局部变量/函数参数/返回值等等,栈是向下增长的。
  2. 内存映射段是高效的I/O映射方式,用于装载一个共享的动态内存库。
  3. 堆用于程序运行时动态内存分配,堆是可以上增长的。
  4. 数据段–存储全局数据和静态数据。
  5. 代码段–可执行的代码/只读常量。

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

malloc/calloc/realloc/free

C++中动态内存管理方式

在兼容c的前提下C++提出自己管理内存的方式:通过new和delete管理;

new和delete操作内置类型

void Test()
{
	// 动态申请一个int类型的空间
	int* ptr4 = new int;
	// 动态申请一个int类型的空间并初始化为10
	int* ptr5 = new int(10);
	// 动态申请10个int类型的空间
	int* ptr6 = new int[10];//[]中的10为创建对象的个数
	delete ptr4;
	delete ptr5;
	delete[] ptr6;
}

说明:申请和释放单个空间,要使用new和delete操作符,申请和释放连续的空间要使用new[ ]和delete[ ]操作符。

new和delete操作自定义类型

class A
{
public:
	A(int a = 0)
	: _a(a)
	{
		cout << "A():" << this << endl;
	}
	~A()
	{
		cout << "~A():" << this << endl;
	}
private:
int _a;
};
int main()
{
	A* p1 = (A*)malloc(sizeof(A));
	A* p2 = new A(1);
	free(p1);
	delete p2;
	// 内置类型是几乎是一样的
	int* p3 = (int*)malloc(sizeof(int)); 
}

说明:new/delete 和 malloc/free最大区别是 new/delete对于自定义类型除了开空间还会调用构造函数和析构函数。

operrator new函数和operator delete函数

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

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

new和delete的实现原理

内置类型

如果申请的是内置类型的空间,new和malloc,delete和free基本类似,不同的地方是:new/delete申请和释放的是单个元素的空间,new[]和delete[]申请的是连续空间,而且new在申请空间失败时会抛异常,malloc会返回NULL。

自定义类型

new的原理

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

delete的原理

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

new T[N]的原理

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

delete[]的原理

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

标签:管理,int,申请,C++,空间,内存,operator,new,delete
From: https://blog.csdn.net/attitude_lu/article/details/139214069

相关文章

  • CCF-GESP 等级考试 2024年3月认证C++一级真题解析
    2024年03月真题1单选题第1题C++表达式(3-2)*3+5的值是()。A.-13B.8C.2D.0正确答案:B.8解析:首先计算括号中的表达式(3-2),得到(1)。接下来进行乘法运算(1*3),得到(3)。最后进行加法运算(3+5),得到(8)。因此,表达式的值是(8)。第2题C++......
  • CCF-GESP 等级考试 2024年3月认证C++一级真题
    2024年03月真题1单选题第1题C++表达式(3-2)*3+5的值是()。A.-13B.8C.2D.0第2题C++语句cout<<"5%2="<<5%2执行后的输出是()。A.22B.11C.5%2=2D.5%2=1第3题执行C++语句cin>>a时如果输入5+2,下述说法正确的是()。A.变量a将被......
  • DDR(Double Data Rate)内存技术经历了几个主要的发展阶段,每个阶段都带来了新的技术和性
    DDR(DoubleDataRate)内存技术经历了几个主要的发展阶段,每个阶段都带来了新的技术和性能改进。以下是DDR内存技术的发展阶段:DDR1:DDR1内存于2000年首次推出,它是第一个双倍数据传输速率的内存标准。DDR1内存的数据传输速率是SDRAM的两倍,从而提供了更高的内存带宽和性能。DDR2:DD......
  • 【计算机毕业设计】基于SSM+Vue的新能源汽车在线租赁管理系统【源码+lw+部署文档】
    摘 要随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的先进技术接轨,通过科技手段来提高自身的优势,新能源汽车在线租赁当然也不能排除在外。新能源汽车在线租赁是以实际运用为开发背景,运用软件工程开发方法,采用SSM技术构建的一个管理系统。整个开发过程首先......
  • 03 安装及管理应用程序
    1、Linux命令与应用程序的关系在Linux操作系统中,一直以来对命令和应用程序没有特别明确的区别,因此对安装软件包与安装应用程序这两种说法,并不做严格的区分。2、Linux应用程序的组成安装完一个软件包之后,可能会向系统中复制大量的数据文件,并进行相关设置。在Linux操作系统中......
  • 02 目录和文件管理
    1、Linux目录结构在Linux操作系统中的目录和文件数据被组织为一个树形目录结构注:Linux操作系统中只有一个根目录,而Windows操作系统中每个分区都有一个根目录Linux系统中使用斜杠/进行分隔,而windows系统中使用反斜杠\分隔。整个树形目录中使用一个/表示根目录,根目录是Linux......
  • C++冷知识:ANSI标准控制字符,快@你的C友一起看吧~
        先赞后看,养成习惯,求求啦!             在终端中,有一种字符,叫做ANSI标准控制字符。        我们以前知道(不知道的看):'\n'//换行符'\a'//响铃'\r'//回到第一行第一列'\b'//回删    这次,我们要整个终端变颜色,可以用到:syst......
  • 小猴编程周赛C++ | 字符串价值
    学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!附上汇总贴:小猴编程C++|汇总-CSDN博客【题目描述】一个字符串的价值定义为:该字符串所有字母价值之和,一个字母如果在字符串中是第一次出现,则该字母的价值为2,否则价值为1,并且......
  • 小猴编程周赛C++ | 环形最大子段和
    学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!附上汇总贴:小猴编程C++|汇总-CSDN博客【题目描述】给出一个长度为n的环形数组a1......
  • 小猴编程周赛C++ | 密码锁
    学习C++从娃娃抓起!记录下在学而思小猴编程学习过程中的题目,记录每一个瞬间。侵权即删,谢谢支持!附上汇总贴:小猴编程C++|汇总-CSDN博客【题目描述】小猴有一个密码锁,密码锁是由n个轮子组成,每个轮子上都写着数字a......