2013-06-26 149 views
9

我有一個涉及內存分配的問題。比方說,我創建了一個像這樣的指針數組。指針數組的C++內存分配

int **numbers = new int *[1024*1024]; 

我以爲這需要8MB內存(Mac 64位上的8字節指針),但情況並非如此。內存只在每個指針分配一個值時分配。所以,如果我NULL所有的指針,然後我看到8MB被分配。

for(int i=0; i<1024*1024; i++) 
{ 
    numbers[i] = NULL; 
} 

我的應用程序如何知道哪些指針爲其分配了一個值而不爲其分配內存?

+9

'new'可能只是保留地址空間,並且只有在寫入內存後才提交內存。這是一種常見的優化,由操作系統執行。 – Mankarse

+0

只是爲了增加混淆,如果您要讀取而不是寫入所有指針,它們都將爲NULL,但在這種情況下,您的內存不會增加,因爲您只需讀取零頁並重新開始。 – Neil

回答

5

您正在觀察操作系統的一個功能,稱爲overcommit-accounting

默認情況下,未分配的內存僅獲取保留的地址空間(進程特定的虛擬內存)。只有在爲其分配值時,頁面纔會真正映射到頁面表中的物理地址。

2

我的猜測是內存分配,但沒有顯示在ps/top結果[不知道在mac中的哪個工具],因爲頁面沒有被觸及。 chk所有內存相關的列

12

從C++的角度來看你的內存已經分配了。您最好不要通過操作系統報告的方式來混淆自己。

你的「app」肯定不知道它是否指定了一個指針 - 只是你作爲程序員負責在賦值之前不使用任何指針。

如果對可能的背景感興趣,請看看這裏或其他文章中的memory overcommit