回答
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