2010-07-14 72 views
2

我試圖分配的內存不是很大或任何東西。我只是不能分配 1.5到1.7千兆字節的傳染性內存。據我所知,Windows爲您提供了2 GB的虛擬空間供您的應用程序使用。所以,像malloc(1500 * 1024 * 1024)這樣的調用並不完全是瘋狂的。我試過malloc,new [],VirtualAlloc都沒有工作。我如何分配2千兆字節的C++內存塊?

有什麼我在這裏失蹤? 有人告訴我這與物理內存有關,我完全否認這一點,因爲爲什麼虛擬空間,地址轉換表和TLB被髮明,如果我分配物理內存。

如果我在具有256兆內存的機器上分配1.5個演出,我嘗試訪問不應該系統會顛簸但工作?

+2

記憶是否具有傳染性?這就像是Alzhemiers的對面嗎? ;) – Guffa 2010-07-14 20:08:18

回答

3

不同版本的Windows有different memory restrictions。如果您使用的是32位版本,則可能需要使用4GB tuning techniques分配2GB以上的內存。

+0

謝謝..但我甚至不能分配低於2G ...甚至1.2千兆字節失敗 – yosef 2010-07-14 20:31:19

+0

@yosef:2GB必須包含您的所有程序,所有其他數據,它的所有DLL,所有DLL的數據等等。所以如果你不能分配1.2GB,它可能已經使用〜800MB。另一種可能是內存碎片化。無論哪種情況,使用答案中提到的4GB調整技術都可能有所幫助。 – psmears 2010-07-14 20:54:06

1

如果您運行的是Windows的32位版本,你有虛擬2GB空間的最大值。您編譯的程序和C/C++運行時庫分別使用其中的一部分,以及預分配的代碼和數據段。如果你運行一個32位的窗口,你的內存空間比你想象的要少。我會同意1.5Gb聽起來不合理,但你會認爲MS產品也不是不合理的,對嗎?

嘗試使用samller作爲健全檢查(例如,1Gb);我懷疑這會成功。在沒有任何實際上限的情況下,嘗試在64位系統上進行大量分配。

+0

好吧,你有這個權利...我只是想與德爾福2009年同樣的事情,我能夠分配1.5千兆字節,但不是一兆字節多 – yosef 2010-07-14 20:33:22

0

您使用ODBC嗎? 32位窗口中的ODBC dll似乎將自己插入虛擬地址空間中的一個尷尬處,導致類似您的大型分配失敗。解決方法是配置您的應用程序以延遲加載ODBC dll,然後確保在調用任何使用ODBC的任何內容之前分配您的大塊。

+0

no ..我剛開始一個空的項目,我只寫 void * ptr = malloc(1500 * 1024 * 1024); 實際上,當我試圖最大我可以得到的是1.6千兆字節......但與正常的應用程序,我甚至不能得到1.2 我認爲這是內存碎片。這也很奇怪,因爲應用程序在調用malloc之前最多需要50兆字節 – yosef 2010-07-14 21:25:32