回答
smartass的答案是「是的,內存分配可能因任何原因失敗」。這可能不是你想要的。
通常,您的系統是否有剩餘空閒內存與分配是否成功無關。相反,問題是您的進程地址空間是否有免費virtual address space。
分配器(malloc
,operator new
,...)首先檢查是否有在目前的過程,是已經自由地址空間映射,也就是說,內核是知道的地址應該是可用的。如果存在,該地址空間在分配器中保留並返回。
否則,內核被要求將新的地址空間映射到進程。這可能會失敗,但一般不會,因爲映射並不意味着使用物理內存 - 它只是一個承諾,如果有人試圖訪問此地址,內核將嘗試找到物理內存並設置MMU表,以便虛擬 - >物理轉換找到它。
當系統內存不足時,沒有剩餘物理內存,進程暫停,內核嘗試通過將其他進程的內存移動到磁盤來釋放物理內存。應用程序不會注意到這一點,除非執行單個彙編程序指令顯然需要很長時間。
如果沒有足夠大的映射空閒區域並且內核拒絕建立映射,則進程中的內存分配失敗。例如,並非所有虛擬地址都可用,因爲大多數操作系統都將內核映射到某個地址(通常爲0x80000000,0xc0000000,0xe0000000或32位體系結構等),因此每個進程的限制可能低於系統限制(例如,即使系統爲64位,Windows上的32位進程也只能分配2 GB)。文件映射(如程序本身和DLL)進一步減少了可用空間。
一個非常普遍的理論答案是否定的,它不能。它可能在非常奇怪的情況下失敗的原因之一是可用/可分配內存會出現一些奇怪的碎片。我想知道你是否正在嘗試獲得(可能非常小的)性能提升(如果指針== NULL,則跳過 - 有點事),或者你只是想知道並且想討論它,在這種情況下,你應該使用聊天。
是的,當您在32位應用程序中的內存空間不足時,內存分配通常會失敗(可能是2,3或4 GB,具體取決於操作系統版本和設置)。這是由於內存泄漏。如果您的操作系統的交換文件空間不足,它也可能會失敗。
- 1. Windows Phone和大內存分配
- 2. 在Linux內核中分配可交換內存
- 3. Windows內存分配問題
- 4. 分配內存和保存串在C
- 5. Ç - 內存分配和釋放內存
- 6. 分配的內存塊不相交?
- 7. 模板和內存分配
- 8. malloc分配內存和SIGSEGV
- 9. int char *和內存分配
- 10. JSON樹和內存分配
- 11. Enumerable.Range和內存分配
- 12. 分配和釋放內存
- 13. 內存分配和結構
- 14. 內存分配和釋放
- 15. 在C++中分配和釋放內存
- 16. 內存分配
- 17. 內存分配
- 18. 內存分配
- 19. 內存分配
- 20. 內存分配
- 21. 內存分配
- 22. 內存分配
- 23. 內存分配
- 24. 分配內存
- 25. 內存分配
- 26. 解構分配和可變交換
- 27. 內存泄漏在C /內存分配++
- 28. uCOS-III下的內存分配
- 29. Windows Phone配置文件和高內存
- 30. 分配(和取消分配)內存char * [64]在C