💖 前言
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。
💖 结论
在程序中根据场景选择不同的函数进行使用,多总结,多学习,多进步。
|