本文主要是介绍C++ 中 malloc 和 calloc 以及 new 的区别,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
结论
malloc 、calloc、new 都是用来在 堆区
分配内存的,根据语言可以分类两类:
- C :malloc 、calloc
- C++ :new
malloc 和 calloc 主要区别:
- malloc 只申请内存,不初始化
- malloc 可以用于任何类型的分配
- calloc申请内存并初始化所有位为 0
- calloc主要用于数组类型的分配
- malloc 执行效率要高于 calloc
new 是 c++ 中用来在 堆区
分配内存的,它跟 malloc 一样 不会初始化所有位 且执行效率几乎一致,但是,它会调用对应数据类型的构造函数。
其次,使用 malloc 、calloc、new 分配的内存,都可以使用 delete 来释放,如果要遵循 C 写法,请使用 free 函数。
tips: 不要使用 free 函数去释放由 new 分配的内存,具体的看 《C++ 中 free 与 delete 的区别》
在 malloc 、 calloc 以及 new 之间如何选择?
- 遵循 C++ 写法时,应优先使用
new
分配所有类型 - 遵循 C 写法时,可以参考以下方案:
- 分配
string
类型选 calloc - 分配非
string
类型选 malloc
- 分配
论证
-
证明 malloc 、calloc、new 都是在
堆区
分配内存的#include <iostream>using namespace std;int main() {char *c1 = (char *)calloc(1, 10);char *c2 = (char *)malloc(10);char *c3 = new char[10];// 输出内容: calloc: 7543664 malloc: 7543704 new: 7543744cout << "calloc: " << (int)c1 << " malloc: " << (int)c2 << " new: " << (int)c3 << endl;system("pause");return 0; }
如上述代码输出结果为证,
c1
、c2
及c3
内存地址相近,故判定处在一个区域,另外根据c++
内存分区模型判定所处区为堆区
-
证明 malloc 、calloc、new 初始化方式
#include <iostream>using namespace std;int main() {char *c1 = (char *)calloc(1, 10);char *c2 = (char *)malloc(10);char *c3 = new char[10];c1[0] = 'a';c1[1] = 'b';c2[0] = 'a';c2[1] = 'b';c3[0] = 'a';c3[1] = 'b';cout << c1 << endl;cout << c2 << endl;cout << c3 << endl;system("pause");return 0; }
输出结果:
ab 瓠侯 瓠侯 请按任意键继续. . .
通过对结果的分析,发现
c2
与c3
的输出结果一致。而c1
完整显示。想一想:为什么
c2
和c3
输出的是乱码 ?如何避免? -
证明 delete 可以释放由 malloc 、calloc、new 分配的内存
#include <iostream>using namespace std;int main() {char *c1 = (char *)calloc(1, 10);char *c2 = (char *)malloc(10);char *c3 = new char[10];c1[0] = 'a';c1[1] = 'b';c2[0] = 'a';c2[1] = 'b';c3[0] = 'a';c3[1] = 'b';delete[] c1;delete[] c2;delete[] c3;cout << c1 << endl;cout << c2 << endl;cout << c3 << endl;system("pause");return 0; }
输出结果:
铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪铪>猍?请按任意键继续. . .
通过输出结果判断,经过 delete 释放过后,指针变成了野指针,此时再访问内存将是非法的,没有任何数据的,所以会显示乱码。此示例再次告诉我们,切勿使用 野指针
这篇关于C++ 中 malloc 和 calloc 以及 new 的区别的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!