new delete malloc free

 new和delete

其實主要是malloc和free不能滿足非內部對象的創建和析構,  
  所以引入new,delete   
    
  malloc只認字節數,不管數據類型,  
  只能返回一個void   *  
  這些都是他的問題。   

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

       mallocfreeC++/C語言的標準庫函數,new/deleteC++的運算符。它們都可用於申請動態內存和釋放內存。

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

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

我們先看一看malloc/freenew/delete如何實現對象的動態內存管理,見示例7-8

 <?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />

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/freenew/delete如何實現對象的動態內存管理

 

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

所以我們不要企圖用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也一樣。

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