malloc、calloc、realloc、new等堆内存分配函数

在这里插入图片描述

💖 前言

malloc、calloc、realloc、new这四个函数都是从堆内存中分配内存,然后使用,但是,有所不同。

如有理解不对的地方,欢迎各位指出,大家共同交流和学习。 如有帮助,请点赞加支持! 送人玫瑰手有余香!🌹🌹🌹

💖 malloc、calloc和new的对比

先看一段代码:

void test01()
{
	int *p1 = (int *)malloc(sizeof(int)*5);//只分配内存,不初始化  
	int *p2 = (int *)calloc(5,sizeof(int));//不仅分配内存,还进行初始化
	int *p3 = new int[5];				   //只分配内存,不初始化 
	
	
	cout << "p1指针地址:" <<p1 << endl;
	cout << "p2指针地址:" << p2 << endl;
	cout << "p3指针地址:" << p3 << endl;
	
}

结果:
在这里插入图片描述
打断点,查看内存情况,如下:
在这里插入图片描述

从结果可以看出,malloc和new分配内存,不进行初始化;calloc不仅分配内存还进行初始化。

对于像类这样的非内部数据类型的对象而言,光用malloc无法满足动态对象的要求。所以,出现了new操作符,在创建对象的同时要自动执行构造函数。new操作符的底层还是malloc分配内存。malloc函数是C++/C语言的标准库函数,与free函数配合使用;new是C++ 运算符,与delete配合使用。

💖 realloc的作用

先看一段测试代码:

void test02()
{
	int *p1 = (int *)malloc(sizeof(int)*5);
	int *p2 = (int *)realloc(p1,10);
	
	cout << "p1指针地址:" <<p1 << endl;
	cout << "p2指针地址:" << p2 << endl;
	
}

结果:

p1指针地址:013758D8
p2指针地址:013758D8

而realloc是对内存进行扩容操作,不改变原有内存的值。
打断点,查看内存情况,如下:
在这里插入图片描述
从图中可以看出,新的内存起始地址和旧的内存起始地址相同,且不改变原内存地址中的值。

注意,如果传入的第一个参数为nullptr/NULL,功能等价于malloc。

💖 结论

在程序中根据场景选择不同的函数进行使用,多总结,多学习,多进步。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值