2012-05-04 50 views
6

新運算符是否保證分配連續的堆內存?即是C++新操作符 - 內存佈局

objects=new Base[1024]; 

在存儲器分配方面相同

objects=(Base*)malloc(1024*sizeof(base)); 

或能有間隙?

回答

8

是的,內存將是連續的。在配置方面,它與malloc版本相同,但有幾處不同(調用構造函數,new不返回NULL,malloc不會拋出異常等)。

請注意,您不能將new[]deletefree混淆,您必須使用delete[] objects來釋放內存。

+0

這不完全相同。 'new []'版本將調用每個對象的默認構造函數。 –

+1

@ edA-qamort-ora-y這就是我所說的...... –

+0

對不起,我今天瞎了,我猜。然而,新版本會分配更多的空間來記住數組的大小,所以'delete []'可以調用正確數量的析構函數。這當然是空間上的微小差異。 –

3

也許吧。 new運算符執行兩件事:它調用operator new函數,該函數將返回一個連續的內存塊,並對所有可能的類型進行適當的對齊(除非不是這樣;例如新的錯誤放置位置)。然後它調用該對象的構造函數,它可以做任何事情。包括分配額外的塊,這些塊不會與第一塊連續。

0

如果new運算符未超載,則分配的內存塊是連續的。但是如果它超載,我們無法知道(一些邪惡的程序員可能已經超載了它:D)