malloc和new的區別,new和operator new的區別,分配器介紹

littleway發表於2014-05-30

首先先解釋幾個概念:

分配空間和初始化:分配空間只是在記憶體上劃定一片區域作為已分配空間使用,但是該空間上的值是未知的;而初始化則是對空間進行了賦值過程,也就是已經可以正常使用了。

malloc和new:

從本質上來說,malloc只是分配空間,不進行任何初始化,記憶體空間上的值是未知的,而new則是分配完空間,同時在該分配完的控制元件上進行初始化,也就是呼叫建構函式,所以malloc出來的空間,你還要在上面賦值才能當成你想要的型別來使用。

從使用方法上,malloc返回的是void*指標,所以你必須進行強制轉換才能把分配出來的空間的首地址指標賦給新指標,例如char *p = (char *)malloc( sizeof(char) * 5); 而new就不需要了,直接A *p = new A(type); 其中的type是建構函式的輸入引數,可以隨意選擇一個建構函式,若無可以省略。同時,malloc的輸入引數必須是位元組數,例子中用到了sizeof。

所以malloc和new就體現了文章開頭提到的分配空間和初始化的問題。

分配器介紹:

在C++中,有一個類:allocator類,是C++的一個模板,它提供型別化的記憶體分配以及物件的分配和撤銷。allocator類將物件分配和物件構造分開。這裡的物件分配和物件構造當然也是上文提到的分配和初始化啦。

allocator<T> a;

所以,allocator有兩個相應的操作,a.allocate(n):分配n個T物件的空間;a.construct(p, t):在T* p指標所指的記憶體空間,執行復制建構函式用t對p指向物件其進行初始化。當然,析構a.destroy(p)和釋放記憶體a.deallocate(p, n)則是相反的操作,deallocate是釋放p開頭的n個T物件的空間。

new和operator new:

new是表示式,而operator new則是函式。

operator new是C++中另外一種原始記憶體的分配方法,用它可以分配未型別化的空間,new運算子和malloc基本是等同的;但C++允許你通過過載的方式自行擴充套件,使得new運算子背後完成的工作任意複雜——只要最後它能給出合適大小、可讀寫的記憶體就行。

new的操作相當於呼叫operator new分配空間 + construct + 返回物件指標。

相關文章