一、相同点
1. 都可以用来动态的分配和释放内存。
二、不同点
1. malloc/free是C的库函数,而new/delete是C++的操作符。
2. malloc不能用来动态创建对象。对象需要在创建的时候调用构造函数,在销毁的时候调用析构函数。但是因为malloc/free是库函数而非操作符,编译器对之无控制权。而new/delete可以用来动态的创建销毁对象。
3. 当分配内存出错时,malloc返回NULL,new则有两种处理方法:抛出bad_alloc异常,或者返回NULL(这是编译器相关的)。如果不处理此异常,系统则调用C++标准库中的terminate()函数,在默认情况下,terminate()将调用abort()终止程序。如果你不想new抛出异常,可以调用new的无异常版本:new(std::nothrow)。
4. malloc返回的值为void*,因而需要类型转换;而new返回的指针有类型信息。
三、注意
1. 如果使用free去释放由new创建的对象,会出问题,因为free无法调用析构函数,析构函数里作的工作将不再被做(编译链接没有问题)。如果用delete去释放由malloc创建的内存,没有问题,但可读性差。故而最好配套使用。
四、例子
class Base
{
public:
Base(){cout<<"constructor";}
~Base(){cout << "destructor";}
};
int main()
{
cout << "pB1:\n";
Base* pB1 = (Base*)malloc(sizeof(Base));
delete pB1;
cout << endl << "pB2:\n";
Base* pB2 = new Base;
free(pB2);
system("pause");
return 0;
}
输出为:
可见,用malloc时未调用构造函数,用free时未调用析构函数。
参考:
1. http://www.pixelstech.net/article/index.php?id=1340193129