malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符

malloc與free是C++/C語言的標準庫函數,new/delete是C++的運算符。它們均可用於申請動態內存和釋放內存
        對於非內部數據類型的對象而言,光用maloc/free沒法知足動態對象的要求。對象在建立的同時要自動執行構造函數,對象在消亡以前要自動執行析構函 數。因爲malloc/free是庫函數而不是運算符,不在編譯器控制權限以內,不可以把執行構造函數和析構函數的任務強加於malloc/free。  
          所以C++語言須要一個能完成動態內存分配和初始化工做的運算符new,以及一個能完成清理與釋放內存工做的運算符delete。注意new/delete不是庫函數。  
  咱們先看一看malloc/free和new/delete如何實現對象的動態內存管理,見示例7-8。  
   
  class   Obj{
public   :                
Obj(void){   cout   <<   「Initialization」   <<   endl;   }
~Obj(void){   cout   <<   「Destroy」   <<   endl;   }
void         Initialize(void){   cout   <<   「Initialization」   <<   endl;   }
void         Destroy(void){   cout   <<   「Destroy」   <<   endl;   }};  
  
void   UseMallocFree(void)
{         Obj     *a   =   (obj   *)malloc(sizeof(obj));         //   申請動態內存        
a->Initialize();                                                 //   初始化         //…        
a->Destroy();         //   清除工做        
free(a);                 //   釋放內存}  
  void   UseNewDelete(void)
{         Obj     *a   =   new   Obj;         //   申請動態內存而且初始化       
 //…         delete   a;                         //   清除而且釋放內存}  
  示例7-8   用malloc/free和new/delete如何實現對象的動態內存管理  
   
  類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也同樣。  
  全局內存對象使用GlobalAlloc函數分配,在Windows   3.X的時代,分配的內存能夠有兩種,全局的和局部的,例如GlobalAlloc和LocalAlloc。但在Win32的時代這些函數已經被廢棄了, 如今的內存只有一種就是虛存。在Win32中全部的進程所使用的內存區域是相互隔離的,每一個進程都擁有本身的地址空間。並且系統使用了頁面交換功能,就是 利用磁盤空間來模擬RAM,在RAM中數據不使用時將會被交換到磁盤,在須要時將會被從新裝入RAM。    


二者都是在堆上分配內存區。  
  malloc()是C運行庫中的動態內存分配函數,WINDOWS程序基本不使用了,由於它比WINDOWS內存分配函數少了一些特性,如,整理內存。  
  GlobalAlloc()是16位WINDOWS程序使用的API,返回一個內存句柄,在實際須要使用時,用GlobalLock()來實際獲得內存 區。但,32位WINDOWS系統中,應使用新的內存分配函數HeapAlloc()以獲得更好的支持,GlobalAlloc()還能夠用,主要是爲了 兼容。函數

相關文章
相關標籤/搜索