malloc/free和new/delete都是用来申请动态内存和释放内存的,它们都是在堆上申请的的空间,在大部分情况下是通用的。并且虽然new/delete的底层实现也是通过malloc/free实现的但是它们两者之间是有着极大的不同的。
1、malloc/free是函数,而new/delete则是操作符。
2、malloc只负责申请空间而不会初始化,而new不但可以开辟空间,还可以进行初始化。要注意的是new/delete申请和释放的是单个元素的空间,new[]和delete[]申请和释放的是连续空间。
// 动态申请一个int类型的空间,没有初始化
int *p1 = (int*)malloc(sizeof(int));
// 动态申请10个int类型的空间,没有初始化
int *p2 = (int*)malloc(sizeof(int)*10);
free (p1);
free (p2);
// 动态申请一个int类型的空间
int* ret1 = new int;
// 动态申请一个int类型的空间并初始化为10
int* ret2 = new int(10);
// 动态申请10个int类型的空间
int* ret3 = new int[10];
delete ret1;
delete ret2;
delete[] ret3;
3、malloc申请空间时,需要手动计算空间大小并传递,但是new只需在其后跟上空间的类型即可。
// 申请10个int类型的空间
int* p1 = (int*)malloc(sizoef(int) * 10);
free(p1);
// 申请10个Test类型的对象
int* p2 = new int[10];
delete[] p2;
4、malloc的返回值为void*,表示分配内存的起始地址,因此malloc的返回值需要强转成指定类型的地址,而new不需要,因为new后跟的是空间的类型。
5、对于malloc,当它申请空间失败时,返回的是NULL,因此使用时必须判空,而new不需要,但是new需要抛异常。
6、在申请自定义类型对象的时侯,malloc/free只会进行开辟空间的操作,不会调用构造函数与析构函数,而new在申请空间后会调用构造函数完成对象的初始化,delete在释放空间前会调用析构函数完成空间中资源的清理。