看过不少人的面经,经常问到 new 和 malloc 的区别。在探究 malloc和 new 的区别时,我们首先应该知悉这二者的基本概念与用法。
malloc/free是 C++/C 语言的标准函数,new/delete是C++的运算符。
1. malloc 和 free 的函数原型:
void * malloc(size_t_size); //malloc 函数原型
void * free(void * ptr); //free 函数原型
2. malloc/free 和 new/delete 的使用:
(1)动态开辟内存
//malloc/free
int *p =(int*)malloc(sizeof(int));
free(p);
//new/delete
int *p = new int;
delete p;
(2)开辟数组
// malloc/free
int * cpp = (int *)malloc(sizeof(int)*10);
free(p);
// new/delete
int * cpp = new int[10];
delete[]cpp;
3. malloc/free 和 new/delete 的区别
如下表所示:
特征 | new/delete | malloc/free |
/ | 关键字 | 库函数 |
/ | 可以做初始化 | 单纯开辟内存 |
重载 | 可以 | 不可以 |
相互调用 | 可以,看具体的operator new/delete实现 | malloc不能调用new |
开辟常量 | 可以 | 不可以 |
分配内存的位置 | 自由存储区 | 堆 |
分配内存的大小 | 由编译器根据类型计算得出 | 必须显式指定字节数 |
分配内存时内存不足 | 客户能够指定处理函数或重新指定分配器 | 无法通过用户代码进行处理 |
已分配内存的扩充 | 无法直观的处理 | 使用realloc简单完成 |
内存分配成功返回值 | 完整类型指针 | void* |
内存分配失败返回值 | 默认抛出异常 | 返回NULL |
处理数组 | 有处理数组的new版本new[] | 需要用户计算数组的大小后进行内存分配 |
构造函数和析构函数 | 调用 | 不调用 |