参考原文:https://www.cnblogs.com/ywliao/articles/8116622.html 这篇写的超级好
a) 申请内存的位置
- new:自由存储区 ---delete释放内存
- malloc:堆 ---free释放内存
b) 返回类型
- new:内存分配成功,返回对象类型的指针,无需进行类型转换
- malloc:内存分配成功,返回void*,需要强制转换将void*类型指针转换为所需类型。
如: int *arr=new int[n];/ delete[] arr; ///n已知
int *a=(int *)malloc(n*sizeof(int)); /free(a)//定义动态数组 相当于int a[n]
c) 内存分配失败的返回值
- new:抛出bac_alloc异常,不会返回null
- malloc:返回null;
判断语句:
- new: try/catch
try
{int *a=new int();}
catch(bad_alloc)
{…}
- malloc: if/else
if(null==a)
{…}
else
{…}
d) 初始化时是否需要指定内存大小
- new:不需要,编译器会根据类型自行计算出类型*数目=内存大小
- malloc:需要,需要显示的指出所需内存的尺寸,即(sizeof(type)) or (sizeof(type)*num)
e) 是否调用构造函数/析构函数
- new:会;使用new时后调用构造函数进行内存分配,使用delete调用对象的析构函数释放内存。
- malloc:不会
f) 是否可以互相调用
- new:实现可以基于malloc
- malloc:实现不可以调用new
g) 是否可以被重载
- new/delete: 可以被重载,标准库定义了4对重载版本
- malloc/free: 不允许被重载
h) 使用中内存扩充
- new:不支持
- malloc:如果使用中发现内存不足,可以使用realloc函数进行扩充