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

原文地址:https://www.cnblogs.com/cauchy007/p/4525417.html