1. 申请的内存所在位置
malloc是函数,而new是C++关键字。malloc从堆上申请内存,而new从自由存储区中申请内存,自由存储区是C++中基于new操作符的一个抽象概念,凡是用new申请内存,该内存即为自由存储区,可以是堆也可以是静态存储区。而堆是操作系统中的术语,是一块特殊的内存。
2.返回类型安全性
malloc返回的是void*,需要自己强转成需要的类型,所以类型不安全,new返回对象的指针,类型与对象完全匹配,所以new是符合类型安全的操作符。
3.内存分配失败时的返回值
malloc分配失败返回NULL,习惯在返回之后判断指针是否为空来判断内存是否分配成功。而new内存分配失败抛出bad_alloc异常,可以通过try,catch来捕获异常并处理它。
4.是否需要指定内存大小
new无需指定内存块的大小,编译器会根据类型信息自动计算。而malloc需要显示指出所需内存的尺寸。
5.是否调用构造函数/析构函数
用new为对象分配内存经历三个过程:
1.调用operator new 分配一块足够大的内存来存储对象。
2.调用对象的构造函数构造对象
3.返回对象的指针
delete释放对象经历2个步骤:
1.调用对象的析构函数
2.调用opreator delete 释放对象所占内存
而malloc不会调用构造,free不会调用析构
6.对数组的处理
C++通过new 类型[] 来处理数组类型。
int *p = new int[10];
通过 delete [] p 配套的来释放数组占用内存,否则会造成内存泄漏。
而malloc 需要自己指定数组大小
7.new与malloc是否可以相互调用
operator new实现是调用malloc,operator delete实现是调用free。
而malloc不可以调用new
8.是否可以被重载
operator new和 operator delete 可以被重载,总共提供了8个重载版本,4个可能抛出异常的,4个承诺不抛出异常。
void* operator new (size_t)
void* operator new[](size_t)
void * operator delete(void *) noexcept
void * operator delete[](void *0) noexcept
void *operator new(size_t,nothrow_t&);
9. 能够直观地重新分配内存
用malloc分配内存后,如果使用时发现内存不够,可以调用realloc来重新分配内存实现内存扩充,realloc先判断当前指针所指内存是否有足够的连续空间,有就原地扩大内存,并返回原来的指针,没有的话,分配一块新的扩大后的内存,将原来的数据拷贝到新的内存中,释放原来的内存,返回新地址的指针。
new没有配套设施。
10. 客户处理内存分配不足
new在抛出异常前,先调用用户指定的错误处理函数new_handler,它是一个指针类型,为了指定错误处理函数,用户要调用库函数set_new_handler,它的参数为new_handler指针,指向了内存分配失败时应该调用的函数,返回值也是一个newhander指针,指向了set_new_handler前正在执行的new_handler函数。
malloc不能指定内存分配时该做什么,只能看着返回NULL