C++内存管理

C++内存管理

	###1.C++中整个内存分布分为堆区、栈区、内存映射段、代码段、数据段、还有一个内核区。
	全局数据和静态数据存储在数据段,文字常量区和代码段存储在代码段

在这里插入图片描述
栈区又叫做堆栈段,是向上增长的,栈中主要存放的是一些临时变量,比如非静态局部变量,返回值,函数参数等。

2.malloc、calloc和realloc

malloc: 申请空间,不进行初始化,malloc动态申请的自定义类型的对象时,对象的内容为随机值,	
malloc不能用于自定义类型的构造函数

在这里插入图片描述

		calloc:申请空间+0初始化,calloc在进行动态申请空间。

在这里插入图片描述

realloc:动态申请空间,如果原有的空间有内容,就把原有的内容拷贝到新的空间中,首地址和原有空间地址一致

在这里插入图片描述

内存管理方式

new和delete的用法:new和delete是属于操作符,和malloc,free不同,malloc与free是函数,
可以进行初始化,具体用法如下:int* p=new int; int* p1=new int[10];
delete 释放内存,前者delete p;  后者delete[] p1;

在这里插入图片描述

operator new和operator delete用法

new与delete是操作符,operator new、operator delete是全局函数,new在底层调用operator new函数来
申请空间,delete在底层调用operator delete释放空间

在这里插入图片描述

在这里插入图片描述

malloc/free new/delete的区别

相同点:都是从堆上开辟空间,必须进行手动释放
不同点:1.malloc/free是全局函数,new/delete是操作符
2.new可以进行初始化,malloc开辟的空间不会初始化
3. malloc申请空间时,需要手动计算空间大小并传递,new只需在其后跟上空间的类型即可
4. malloc的返回值为void*, 在使用时必须强转,new不需要,因为new后跟的是空间的类型
5. malloc申请空间失败时,返回的是NULL,因此使用时必须判空,new不需要,但是new需要捕获异常
6. 申请自定义类型对象时,malloc/free只会开辟空间,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理

内存泄漏

内存泄漏不是意思说内存丢失,他指的是内存没有及时得到释放导致内存被占用,内存泄漏指因为疏忽或错误造成程序未能释放已经不再使用的内存的情况。内存泄漏并不是指内存在物理上的消失,而是应用程序分配某段内存后,因为设计错误,失去了对该段内存的控制,因而造成了内存的浪费

内存泄露主要分为堆内存泄露和系统资源泄漏,常见的堆内存泄露就是由于代码的不完善导致程序造成内存浪费
避免内存泄露的方法: 运用智能指针,采用检测工具
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值