2010-09-13 54 views
0

我正在使用visual studio 2008進行開發。我的程序需要處理大量的內存。當我的程序嘗試分配一個512M浮點數組時,會發生錯誤。代碼如下:[內存分配問題]未處理的異常:Microsoft C++異常:內存位置的std :: bad_alloc

int size = 512*512*512; 
float *buffer = new float[size]; 

在此分配之前,程序已經消耗了大約554M的內存。我的桌面有4G主內存,我正在使用Windows XP 32位。

如何避免分配錯誤?非常感謝您的意見!

+0

不是一個解決方案,但你爲什麼不使用'std :: vector'? – GManNickG 2010-09-13 16:55:41

+0

那是512M?你的變量初始化應該是'int size = 512 * 1024 * 1024;'。另外,我會將'size'的數據類型更改爲'size_t'。 – Praetorian 2010-09-13 17:24:42

+0

是否有任何理由需要擁有512M陣列(128M * sizeof(float))?你能把它分成更小的塊嗎?你可以移動到64位系統更多的內存? – 2010-09-13 17:41:19

回答

4

您的陣列需要太多的連續內存。您的程序的可用虛擬內存少於2千兆字節,但該地址空間被大量代碼,數據和各種堆分解。內存是從這些塊之間的空閒空間分配的。在32位操作系統上,當您立即分配時,您可以獲得約650 MB的空間。當你的程序開始使用內存時,它會向南。所有內存分配的總和仍然是〜2GB。

使用64位操作系統或對您的數據結構進行分區。 SysInternals的VMMap實用程序可以讓您深入瞭解程序的虛擬內存映射。

+0

使用/ LARGEADDRESSAWARE鏈接器開關可以讓你超過2GB的限制。我認爲你可以達到3GB左右。當然,你關於連續內存的觀點仍然存在。 – 2010-09-13 17:24:05

+0

嗯,讓啓動選項工作是蹭。 – 2010-09-13 17:28:21

+0

你推薦的軟件非常好。謝謝。 – Aaron 2010-09-13 20:53:15