2013-07-26 51 views
0

我正在調試一個崩潰的程序,因爲沒有連續的內存可以用於我的向量,需要重新分配。所以我有一個問題,如何不使用虛擬內存?虛擬內存可以用哪種方式使用?謝謝。何時會使用虛擬內存(窗口)?

+0

重新分配需要多少內存? – Inspired

+0

你知道虛擬內存是什麼嗎? –

回答

2

虛擬內存由操作系統自動使用。你不需要關心這一點。

就你而言,很可能你運行的是32位應用程序。 Windows中32位進程的用戶地址空間限制爲2 GB(如果使用特定密鑰引導Windows,則3 GB)。如果你的向量需要超過幾百兆的連續地址空間,這可能會成爲一個問題(由於地址空間碎片)。

當然,任何進程可能會耗盡內存(即使在使用虛擬內存和交換文件以及其他任何內容時)。在任務管理器中查看程序的內存使用情況。

+0

目前使用300MB內存,那麼這需要重新分配。是的,它是32位應用程序。 Thannks。 – user1558064

1

虛擬內存是您在現代操作系統(Linux,Unix,Windows,MacOS,Symbian等)上運行的程序中唯一獲得的內存。

這聽起來像你的問題是沒有一個連續的虛擬地址範圍足夠大,你的向量[1]。我懷疑發生了什麼事情,比如你需要一個32位的進程超過1.5GB,這個進程一次只能使用2GB,所以在任何一端都沒有太多的「空間」來填充其他的數據, 「中等」小於1.5GB - 特別是,如果您的矢量正在增長,則需要兩個矢量副本,一個是當前大小,另一個大小是要複製的大小。

一個簡單的解決方案,假設你知道向量需要多大是被設定它的大小,例如vector<int> vec(some_size);

如果你不知道,有一些更多的解決方案:

如果你有一個64位的操作系統,你可以嘗試設置LARGEADDRESSAWARE標誌的可執行文件(假設它的Windows)。由於64位操作系統不必爲操作系統本身預留大量的內存空間(這超出了32位地址範圍,在32位操作系統中),這應該會給您提供更多的內存空間。時,需要啓動與/ 3GB的OS,並設置上述標誌位。

或編譯的代碼爲64位(升級到一個64位操作系統後,如果需要的話)。

[1]當然,除非你正在編寫一個驅動程序,並試圖分配的物理內存多兆字節的緩衝區用於DMA - 但我認爲你會這麼說

0

問題無關記憶,甚至與虛擬內存。一個數組需要一個連續的地址範圍速度(通常在Win32程序中爲2 GB)是分散的,因此沒有足夠的可用空間。

如果你可以得到地址,Windows會自動提供虛擬內存與他們一起去。

現在是時候將您的應用程序移動到64位。