既然有了malloc/free爲什麼還要new/delete?




      最近開發過程當中,有個疑問,就是C中已經有了mallocfree爲什麼在C++中又有new/delete(不負責任的回答是前者是C裏面的,後者是C++裏面的,呵呵)?稱最近有時間好好研究了一下,總的來講是面向過程與面向對象的區別,說的不夠準確,接下來具體看看吧:
  mallocfreeC /C++語言的標準庫函數,new/deleteC++的運算符。它們均可用於申請動態內存和釋放內存。

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

   所以C語言須要一個能完成動態內存分配和初始化工做的運算符new,以及一個能完成清理與釋放內存工做的運算符delete。注意new/delete不是庫函數。malloc/free 和new/delete又是如何實現對象的動態內存管理呢?寫了個小例子:html


class _myClass

{
       public :

        _myClass(void){ cout << 「Initialization」 << endl; }

        ~_myClass(void){ cout << 「Destroy」 << endl; }

        void Initialize(void){ cout << 「Initialization」 << endl; }

        void Destroy(void){ cout << 「Destroy」 << endl; };

void ByeMallocFree(void)
{
  //申請動態內存,對於初學者,這傢伙有點abstract
  _myClass *a = (_myClass *)malloc(sizeof(_myClass));
a->Initialize(); // 初始化
  //…
 a->Destroy(); // 清除工做
  free(a); // 釋放內存
}

void ByNewDelete(void)
{
_myClass *a = new _myClass; // 申請動態內存而且初始化</span>
//...
  delete a; // 釋放內存
}


        看了這個例子有沒有一點想大聲說出其區別是衝動呢?在本例中,類_myClass的函數Initialize模擬了構造函數的功能,函數Destroy模擬了析構函數的功能。函數ByMallocFree中,因爲 malloc/free不能執行構造函數與析構函數,必須調用成員函數InitializeDestroy來完成初始化與清除工做。很明顯利用函數ByNewDelete則十分簡單。
  因此咱們不要企圖用malloc/free來完成動態對象的內存管理,應該用new/delete。因爲內部數據類型的對象沒有構造與析構的過程,對它們而言malloc/freenew/delete是等價的。
  問題又來了,既然new/delete的功能徹底覆蓋了malloc/free,爲啥C不把malloc/free淘汰出局呢?哈哈,這是由於C程序常常要調用C函數,而C程序只能用malloc/free管理動態內存。
    
若是用free釋放「new建立的動態對象,那麼該對象因沒法執行析構函數而可能致使程序出錯。若是用delete釋放「malloc申請的動態內存,理論上講程序不會出錯,可是該程序的可讀性不好。因此new/delete必須配對使用,malloc/free也同樣。若是研究底層實現機制,new/delete應該是在malloc/free的機制基礎上實現的。
數據結構

這回應該明白了吧,恭祝2015新年快樂,繼續奮鬥嘍!

函數


相關文章
相關標籤/搜索