天天看點

C++中new和malloc的差別

1、new 是c++中的操作符,malloc是c 中的一個函數

2、new 不止是配置設定記憶體,而且會調用類的構造函數,同理delete會調用類的析構函數,而malloc則隻配置設定記憶體,不會進行初始化類成員的工作,同樣free也不會調用析構函數

3、記憶體洩漏對于malloc或者new都可以檢查出來的,差別在于new可以指明是那個檔案的那一行,而malloc沒有這些資訊。

4.new可以看成兩個動作:1。配置設定記憶體(相當于malloc)2。引發構造函數。

  new   是個操作符,和什麼"+","-","="...有一樣的地位.   

  malloc是個配置設定記憶體的函數,供你調用的.   

  new是保留字,不需要頭檔案支援.   

  malloc需要頭檔案庫函數支援.   

  new   建立的是一個對象,  

 malloc配置設定的是一塊記憶體.  

 new建立的對象你可以把它當成一個普通的對象,用成員函數通路,不要直接通路它的位址空間 

 malloc配置設定的是一塊記憶體區域,就用指針通路好了,而且還可以在裡面移動指針.  

5、new 和 malloc效率比較

new 有三個字母, malloc有六個字母

new可以認為是malloc加構造函數的執行。

new出來的指針是直接帶類型資訊的。

而malloc傳回的都是void指針。

一:new delete 是運算符,malloc,free是函數

malloc與free是C++/C語言的标準庫函數,new/delete是C++的運算符。它們都可用于申請動态記憶體和釋放記憶體。

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

是以C++語言需要一個能完成動态記憶體配置設定和初始化工作的運算符new,以及一個能完成清理與釋放記憶體工作的運算符delete。注意new/delete不是庫函數。

我們先看一看malloc/free和new/delete如何實作對象的動态記憶體管理,見示例。

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;             // 清除并且釋放記憶體

示例用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也一樣。

二:new delete在實作上其實調用了malloc,free函數。

三:new operator除了配置設定記憶體,還要調用構造函數。

malloc函數隻是負責配置設定記憶體。

繼續閱讀