malloc/free和new/delete

来源:互联网 发布:大数据视频百度云 编辑:程序博客网 时间:2024/04/29 18:17

一、相同点

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

2. http://blog.csdn.net/onlyonename/article/details/8655324

原创粉丝点击