new/delete 和 malloc/free 的區別

malloc和free是c語言的標準庫函數,函數原型分別爲

void * malloc(size_t size)        參數代表字節個數  

void  free(void * p)                     參數代表內存地址


使用上:

  1. void func()  
  2. {  
  3.     //開闢一個空間  
  4.     int* p1=(int*)malloc(sizeof(int));  
  5.     if(p1==NULL)                       
  6.     {  
  7.          exit(1);  
  8.     }  
  9.      free(p1);  
  10.     //開闢多個空間  
  11.     int*p2=(int*)malloc(sizeof(int)*4);  
  12.     if(p2==NULL)  
  13.    {  
  14.         exit(1);  
  15.     }  
  16.     free(p2);  
  17. }  

new  和    delete

  1. void func()  
  2. {  
  3.     //開闢一個空間  
  4.     int* p1=new int(1);  
  5.     delete p1;  
  6.     //開闢多個空間  
  7.     int*p2=new int[4];  
  8.     delete []p2;  
  9. }  

(1)malloc開闢空間類型大小需手動計算,new是由編譯器自己計算;

(2)malloc返回類型爲void*,必須強制類型轉換對應類型指針,new則直接返回對應類型指針;

(3)malloc開闢內存時返回內存地址要檢查判空,因爲若它可能開闢失敗會返回NULL;new則不用判斷,因爲內存分配失敗時,它會拋出異常bac_alloc,可以使用異常機制;

(4)無論釋放幾個空間大小,free只傳遞指針,多個對象時delete需加[]

(5)因爲new/delete是操作符,它調用operator new / operator delete,它們可以被重載,在標準庫裏它有8個重載版本;而malloc/free不可以重載;

(6)對於malloc分配內存後,若在使用過程中內存分配不夠或太多,這時可以使用realloc函數對其進行擴充或縮小,但是new分配好的內存不能這樣被直觀簡單的改變




發佈了57 篇原創文章 · 獲贊 10 · 訪問量 5萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章