1、属性
new/delete 是关键字
malloc/free是库函数
2、参数(是否需要指定内存大小)
new动态申请内存时,不需要指定内存块的大小
int *p = new int;
mallo动态申请内存时,需要显示指定内存的大小
int *p = (int*)malloc(sizeof(int));
3、返回值(返回类型安全性)
new内存分配成功时,返回的是对象类型的指针,是符合类型安全的操作符
mallo内存分配成功时,返回void*,需要通过强制类型转换成所需要的类型
4、分配内存失败
new内存分配失败时,会抛出bad_alloc异常
malloc内存分配失败时,会返回NULL
5、是否调用构造函数/析构函数
new会先调用void* operator new(size_t size)函数(底层是malloc实现的),
然后会调用类型的构造函数,初始化成员变量
delete先调用析构函数,然后调用void operator delete(void* ptr)函数
(底层是free实现的)来释放内存
6、对数组的处理
int* p1 = new int;
delete p1;
int *p2 = new int[4];
delete []p2;
int* p1 = (int*)malloc(sizeof(int));
free(p1);
int *p2 = (int*)malloc(sizeof(int)*4);
free(p2);
释放内存时,无论内存块的大小多大,free只需要传指针
而delete在释放多个对象时,需要加[]
7、new与malloc是否相互调用
new调用operator new函数,operator new底层调用malloc
8、是否可以被重载
C++允许重载new/delete操作符,而malloc不允许
9、分配的内存区域
C++中,将内存区分为:堆、栈、自由存储区、全局/静态存储区、常量存储区
new是从自由存储区(free store)上为对象动态分配内存空间
自由存储区是C++中基于new操作符的一个抽象的概念
malloc申请是从堆上分配内存,堆是操作系统中所维护的一块特殊内存