2011-11-21 60 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,具体取决于操作系统版本和设置)。这是由于内存泄漏。如果您的操作系统的交换文件空间不足,它也可能会失败。