1. 程式人生 > >new、malloc和alloctor關係

new、malloc和alloctor關係

今天看C++primer,看到了動態記憶體管理類,alloctor,也涉及到free,對此有些不清楚,故收集整理一下,理清知識點。

http://blog.sina.com.cn/s/blog_9054a0360101289p.html

首先來說new和malloc。

new-delete;malloc-free

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

2、new 不止是分配記憶體,而且會呼叫類的建構函式,同理delete會呼叫類的解構函式,而malloc則只分配記憶體,不會進行初始化類成員的工作,同樣free也不會呼叫解構函式

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

4.new可以看成兩個動作:1。分配記憶體(相當於malloc)2。引發建構函式。

5、new是操作符,和+、-、*一樣,malloc是函式呼叫。

6、new是保留字,不需要標頭檔案,malloc需要標頭檔案,其標頭檔案是malloc.h或alloc.h。

7、new建立的是一個物件,malloc建立的是一塊記憶體。

new建立的物件你可以把它當成一個普通的物件,用成員函式訪問,不要直接訪問它的地址空間

malloc分配的是一塊記憶體區域,就用指標訪問好了,而且還可以在裡面移動指標.

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

}

類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函式只是負責分配記憶體。

接下來說一下alloctor。

alloctor-Destroy

alloctor是C++中的類,是是標準 C++ 庫中多個容器模板類的建構函式中指定的預設分配器物件。

alloctor分配的記憶體是未構造的,需要新增新元素時用alloctor的construct成員在原始記憶體中建立物件。刪除元素時,用Destroy成員銷燬元素。

該類還有四個工具函式

    alloc_n_copy會分配記憶體,並拷貝一個給定範圍中的元素。

    free會銷燬構造的元素並釋放記憶體

    chk_n_alloc保證StrVec(類,特異性容器,自定義)至少有容納一個元素的空間。若沒有空間,將會呼叫reallocate分配更多記憶體

    reallocate在記憶體用完時為StrVec分配新記憶體