鉴于我有剩余的免费交换内存,我以合理的块(~1MB)分配内存 - >内存分配是否因任何原因仍然失败?
答案 0 :(得分:5)
smartass的回答是“是的,内存分配可能因任何原因而失败”。这可能不是你想要的。
通常,系统是否剩余可用内存与分配是否成功无关。相反,问题是您的流程地址空间是否有免费virtual address space。
分配器(malloc
,operator new
,...)首先查看当前进程中是否存在已经映射的空闲地址空间,即内核知道地址应该可用。如果存在,则在分配器中保留该地址空间并返回。
否则,会要求内核将新地址空间映射到进程。这个可能失败,但通常不会,因为映射并不意味着使用物理内存 - 这只是一个承诺,如果有人试图访问此地址,内核将尝试查找物理记忆并设置MMU表,以便虚拟>物理翻译找到它。
当系统内存不足时,没有物理内存,进程被挂起,内核尝试通过将其他进程的内存移动到磁盘来释放物理内存。应用程序没有注意到这一点,除了执行单个汇编程序指令显然需要很长时间。
如果没有足够大的映射空闲区域并且内核拒绝建立映射,则进程中的内存分配将失败。例如,并非所有虚拟地址都可用,因为大多数操作系统将内核映射到某个地址(通常为0x80000000,0xc0000000,0xe0000000或32位架构上的某些地址),因此每个进程限制可能低于系统限制(例如,Windows上的32位进程只能分配2 GB,即使系统是64位)。文件映射(例如程序本身和DLL)进一步减少了可用空间。
答案 1 :(得分:0)
一个非常一般的理论答案是否定的,它不能。它可能在非常特殊的情况下失败的原因之一是你的可用/可分配内存会有一些奇怪的碎片。我想知道你是否尝试获得(可能是非常小的)性能提升(跳过指针== NULL - 有点事情)或者你只是想知道并想讨论它,在这种情况下你应该使用聊天。
答案 2 :(得分:0)
是的,当32位应用程序中的内存空间不足时,内存分配通常会失败(根据操作系统版本和设置,可能是2,3或4 GB)。这可能是由于内存泄漏造成的。如果您的操作系统在交换文件中的空间不足,它也可能会失败。