Ref: hackbuteer1‘s blog
1、本质区别
malloc/free是C/C++语言的标准库函数,new/delete是C++的运算符。对于用户自定义的对象而言,由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不会自动调用构造函数和析构函数,从而无法满足动态管理对象的要求。因此C++需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。
2. 安全性
int *p = new float[2]; //编译时出错
int *p = malloc(2*sizeof(float)); //编译不报错
1)new内置了sizeof、类型转换和类型安全检查功能,会自动计算需要分配的空间。new在创建动态对象的同时完成了初始化工作(自动调用了默认构造函数,也可以显示调用带参构造函数),但是如果new创建的是对象数组,那只能使用无参数构造函数。
int a = new Obj(para); //动态申请对象,并调用带参构造函数
int *a = new Obj[num]; //动态申请对象数组,只能调用无参数构造函数。
2)malloc需要手工计算字节数,malloc函数本省并不识别要申请的是什么类型,只关心内存的总字节数,因此需要显示的类型转换,用户需要对自己的行为负责(C相对于C++来说很不安全,from《C++编程思想》)。
3. 其他
1)new由两步构成:operator new+construct,同时,operator new可以重载,可以自定义内存分配策略(甚至不做内存分配,甚至分配到非内存设备上)。
2)在面向对象编程时,如果非要使用malloc/free,需要自定义一个initialization和destroy功能函数来完成对象的构造和析构。
3)两种申请内存的方式一定要配套使用:如果用free释放new创建的动态对象,那么该对象因无法执行析构函数而可能导致程序出错;如果用delete释放malloc申请的动态内存,理论上讲程序不会出错,但是该程序的可读性很差。