C++中有了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 如何實現物件的動態記憶體管理,見示例。
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 也一樣。
另外,需要注意的是:delete是運算子,是可以過載的。free是函式,不能過載。