malloc/free 与 new/delete同与不同
一、相同点
1.都是从堆上申请内存,由程序员来掌控这段内存的申请与释放。
2.对于内置类型,两者使用没有太大区别。
二、不同点
1.malloc/free是C++/C语言的标准库函数,需要库支持;new/delete是C++运算符。这一点更深刻的意义在于C++中,运算符可以重载:你可以指定new分配空间真正的地方;你可以指定分配空间后,完成特定的动作;你可以指定分配失败后,完成特定的动作;你可以指定delete后,触发某些特定的事件。
2.使用方法不同:malloc/free需要调用者来计算具体需要分配多少空间,malloc不关心分配的是什么类型,他只关心内存的字节总数,所以他返回的也是void*类型的指针;new/delete就简单得多了,可以识别分配的类型,只需要告诉分配的个数即可。
malloc/free: int *p1 = (int*)malloc(sizeof(int)*10); free(p1); new/delete: int *p1 = new int[10]; delete []p1;
3.malloc/free类型不安全;new/delete类型安全。
malloc/free: int* p = (int *)malloc(sizeof(float)*2); // 编译时无法指出错误 new/delete: int* p = new float[2]; // 编译时指出错误
4.malloc/free只是单纯的分配和释放内存;new/delete在此基础上,会调用该类型的构造函数和析构函数。
class Obj { public : Obj( ) { cout << “Initialization” << endl; } ~ Obj( ) { cout << “Destroy” << endl; } void Initialize( ) { cout << “Initialization” << endl; } void Destroy( ) { cout << “Destroy” << endl; } }; void UseMallocFree( ) { Obj * a = (obj * ) malloc( sizeof ( obj ) ); a -> Initialize(); ... a -> Destroy(); free(a); } void UseNewDelete( void ) { Obj * a = new Obj; … delete a; }
三、一些补充
既然new/delete的功能完全覆盖了malloc/free,为什么C++还保留malloc/free呢?因为C++程序经常要调用C函数,而C程序只能用malloc/free管理动态内存。在C++编程中,尽量使用new/delete,因为他有更多的安全性检查,会在幕后做更多的工作,并且对于自定义类型,也是必须使用new/delete的。