转载

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的。

正文到此结束
Loading...