1. 区别
- new的功能是在堆区新建了一个对象,并返回该对象的指针,所谓的【新建对象】的意思就是,将调用该类的构造函数,因为如果不构造的话,就不能称之为一个对象。
- malloc只是机械的分配了一块内存,如果用malloc在堆区创建一个对象的话,是不会调用构造函数的,严格来说malloc不能算是新建了一个对象,只能说是分配了一块与该类对象大小相同的内存而已,然后强行把它解释为【这是一个对象】,按这个逻辑来,也不存在构造函数什么事.
- 用delelte 去释放一个堆区的对象,会调用该对象的析构函数.
- 用free去释放一个堆区的对象,不会调用该对象的析构函数.
看一个例子
#include<iostream>
#include <malloc.h>
using namespace std;
class TEST{
private:
int num1;
int num2;
public:
TEST(){
num1 = 10;
num2 = 20;
}
~TEST(){
cout << "调用了析构函数"<<endl;
}
void Print(){
cout << num1 << " " <<num2 <<endl;
}
};
int main(int argc,char *argv[])
{
//用malloc()函数在堆区分配一块内存空间,然后用强制类型转换该内存空间
//解释为是一个TEST类对象,这不会调用TEST的默认构造函数
TEST *pObj = (TEST *)malloc(sizeof(TEST));
pObj->Print();
//用new在堆区创建一个TEST类的对象,这回调用TEST类的默认构造函数
TEST *pObj2 = new TEST;
pObj2->Print();
return 0;
}
结果如下:
yang@yang:~$ ./a.out
0 0 //malloc分配的内存,强制类型转换为TEST对象,没有调用构造函数.
10 20 //new分配对象调用了构造函数.
调用了析构函数 //delete 调用了析构函数,free 没有.
- malloc/free是C/C++中的方法(函数),new/delete 是C++中的操作符.
2.有了malloc/free,为什么还要new/delete?
(1)malloc与free是C++/C语言的标准库函数,new/delete是C++运算符,它们都可用于申请动态内存和释放内存.
(2)对于非内部数据类型的对象而言,光用malloc/free无法满足动态对象的要求,对象在创建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数,由于malloc/free是库函数而不是运算符,不再编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加给malloc/free;
(3) 既然new/delete的功能完全覆盖了malloc/free,为什么C++不把malloc/free淘汰出局呢?这是因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。