2011-11-21 59 views
2

對不起我的,而一般的問題,但我無法找到一個明確的答案吧:內存分配和交換(在Windows下)

鑑於我還有自由交換的內存和I在合理的塊分配內存( 〜1MB) - >內存分配仍然可能因任何原因失敗嗎?

回答

5

smartass的答案是「是的,內存分配可能因任何原因失敗」。這可能不是你想要的。

通常,您的系統是否有剩餘空閒內存與分配是否成功無關。相反,問題是您的進程地址空間是否有免費virtual address space

分配器(mallocoperator new,...)首先檢查是否有在目前的過程,是已經自由地址空間映射,也就是說,內核是知道的地址應該是可用的。如果存在,該地址空間在分配器中保留並返回。

否則,內核被要求將新的地址空間映射到進程。這可能會失敗,但一般不會,因爲映射並不意味着使用物理內存 - 它只是一個承諾,如果有人試圖訪問此地址,內核將嘗試找到物理內存並設置MMU表,以便虛擬 - >物理轉換找到它。

當系統內存不足時,沒有剩餘物理內存,進程暫停,內核嘗試通過將其他進程的內存移動到磁盤來釋放物理內存。應用程序不會注意到這一點,除非執行單個彙編程序指令顯然需要很長時間。

如果沒有足夠大的映射空閒區域並且內核拒絕建立映射,則進程中的內存分配失敗。例如,並非所有虛擬地址都可用,因爲大多數操作系統都將內核映射到某個地址(通常爲0x80000000,0xc0000000,0xe0000000或32位體系結構等),因此每個進程的限制可能低於系統限制(例如,即使系統爲64位,Windows上的32位進程也只能分配2 GB)。文件映射(如程序本身和DLL)進一步減少了可用空間。

0

一個非常普遍的理論答案是否定的,它不能。它可能在非常奇怪的情況下失敗的原因之一是可用/可分配內存會出現一些奇怪的碎片。我想知道你是否正在嘗試獲得(可能非常小的)性能提升(如果指針== NULL,則跳過 - 有點事),或者你只是想知道並且想討論它,在這種情況下,你應該使用聊天。

0

是的,當您在32位應用程序中的內存空間不足時,內存分配通常會失敗(可能是2,3或4 GB,具體取決於操作系統版本和設置)。這是由於內存泄漏。如果您的操作系統的交換文件空間不足,它也可能會失敗。