malloc/free和new/delete的區別

malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們均可用於申請動態內存和釋放內存。

對於非內部數據類型的對象而言,光用maloc/free沒法知足動態對象的要求。對象在建立的同時要自動執行構造函數,對象在消亡以前要自動執行析構函數。因爲malloc/free是庫函數而不是運算符,不在編譯器控制權限以內,不可以把執行構造函數和析構函數的任務強加於malloc/free。

所以C++語言須要一個能完成動態內存分配和初始化工做的運算符new,以及一個能完成清理與釋放內存工做的運算符delete。注意new/delete不是庫函數。

咱們先看一看malloc/free和new/delete如何實現對象的動態內存管理,見下面示例。css

 

  1. class Obj  
  2. {  
  3. public :  
  4.     Obj(void){ cout << 「Initialization」 << endl; }  
  5.     ~Obj(void){ cout << 「Destroy」 << endl; }  
  6.     void Initialize(void){ cout << 「Initialization」 << endl; }  
  7.     void Destroy(void){ cout << 「Destroy」 << endl; }  
  8. };  
  9. void UseMallocFree(void)  
  10. {  
  11.     Obj  *a = (obj *)malloc(sizeof(obj));   // 申請動態內存  
  12.     a->Initialize();                        // 初始化  
  13.     //…  
  14.     a->Destroy();   // 清除工做  
  15.     free(a);        // 釋放內存  
  16. }  
  17. void UseNewDelete(void)  
  18. {  
  19.     Obj  *a = new Obj;  // 申請動態內存而且初始化  
  20.     //…  
  21.     delete a;           // 清除而且釋放內存  
  22. }  
 

 

類Obj的函數Initialize模擬了構造函數的功能,函數Destroy模擬了析構函數的功能。函數UseMallocFree中,因爲malloc/free不能執行構造函數與析構函數,必須調用成員函數Initialize和Destroy來完成初始化與清除工做。函數UseNewDelete則簡單得多。

因此咱們不要企圖用malloc/free來完成動態對象的內存管理,應該用new/delete。因爲內部數據類型的「對象」沒有構造與析構的過程,對它們而言malloc/free和new/delete是等價的。

既然new/delete的功能徹底覆蓋了malloc/free,爲何C++不把malloc/free淘汰出局呢?這是由於C++程序常常要調用C函數,而C程序只能用malloc/free管理動態內存。
若是用free釋放「new建立的動態對象」,那麼該對象因沒法執行析構函數而可能致使程序出錯。若是用delete釋放「malloc申請的動態內存」,理論上講程序不會出錯,可是該程序的可讀性不好。因此new/delete必須配對使用,malloc/free也同樣。html



相關文章
相關標籤/搜索