C和C++内存管理(new、malloc和free、delete)

一图读懂内存分配

在这里插入图片描述
总结一下:

  1. 栈(堆栈),存放非静态局部变量、函数参数、返回值等
  2. 堆,用于程序运行时动态内存分配。
  3. 数据段, 存储全局数据和静态数据
  4. 代码段,存放可执行的代码,或者只读常量

malloc、calloc和realloc区别?

  • malloc是在堆上动态开辟空间;
  • calloc是堆上开空间+初始化为0;
  • realloc是对已有空间的扩容,扩容有两种方式(原地扩容和异地扩容)
    在这里插入图片描述
    原地扩容和异地扩容的差异就在扩容后地址变了。

下面体验一下calloc的初始化:
在这里插入图片描述

new & delete

对比new/malloc、delete/free

void BlogTest()
{
	int *p1 = (int*)malloc(sizeof(int) * 10);
	//申请 一个 10个int的数组
	int *p2 = new int[10];

	free(p1);
	delete[]p2;

	int *p3 = (int*)malloc(sizeof(int));
	//申请 一个 单个int的数组
	int *p4 = new int;

	free(p3);
	delete p4;

}

new 申请空间+初始化

在这里插入图片描述

new & delete操作自定义类型

先看C语言中malloc使用:
在这里插入图片描述
感受一下 new 和 delete 和 C语言中 malloc和free的区别:
在这里插入图片描述
再次感受一下new和delete的的作用:
在这里插入图片描述
发现:申请几个对象调用几次构造函数,对应也应执行几次析构函数。

operator new & operator delete

new和delete是用户进行动态内存管理的操作符,但是在低层,他是通过operator new 和operator delete来实现的。operator new实际是通过malloc 来申请空间,operator delete 低层也是通过free来释放空间的。

new 和 delete分析

对于内置类型,如果申请内置类型空间,new/delete 是申请释放单个元素空间,new[]/delete[]是申请释放连续空间;且new在空间申请失败时会抛出异常,malloc则会返回NULL
对于自定义类型,new是1)调用operator new申请空间,2)在申请的空间执行构造函数初始化; delete是1)在孔家先执行析构函数完成清理工作,2)调用operator delete完成对象孔家的释放。对于 new[] 和 delete[]本质是一样,前者先使用operator new完成N个对象空间的申请,再接着在对应空间上使用构造函数N次完成初始化。析构同理,这里不载赘述。

malloc/free 与 new/delete比较

共同点:都是在堆上申请空间,都需要用户手动释放。
不同点:

  1. malloc 、 free 是函数 ,new 、delete是操作符
  2. malloc出来的空间不会初始化,new可以
  3. malloc申请空间时,需要自己计算空间大小,new只需要在其后跟上空间类型即可,对于多个对象new时,只需要在对应“[]”里填上指定对象个数即可
  4. malloc返回值为void* ,使用时需要强转,new不需要(new后接着空间类型)
  5. malloc失败时返回NULL,使用时必须判断是否为空,new不需要,但new需要捕捉异常
  6. malloc 和 free在申请对象时不会调用构造函数和析构函数,但是new和delete会调用对应的构造函数和析构函数。
  • 8
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 20
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值