内存分配与交换(在Windows下)

对于我这个相当普遍的问题感到抱歉,但我找不到明确的答案:

鉴于我有空闲的交换内存剩下,我分配合理的块(〜1MB)的内存 – >内存分配仍然可能因为任何原因失败?

smartass的答案是“是的,内存分配可能因任何原因失败”。 这可能不是你正在寻找的。

一般来说,你的系统是否有剩余空间与分配是否成功无关。 问题是,你的进程地址空间是否有空闲的虚拟地址空间 。

分配器( mallocoperator new ,…)首先查看当前进程中是否存在已经映射的可用地址空间,也就是说,内核知​​道地址应该可用。 如果有,该地址空间在分配器中保留并返回。

否则,内核被要求将新的地址空间映射到进程。 这可能会失败,但通常不会,因为映射并不意味着使用物理内存 – 这只是一个承诺,如果有人试图访问这个地址,内核将尝试找到物理内存并设置MMU表所以虚拟 – >物理翻译找到它。

当系统内存不足时,没有剩余的物理内存,进程暂停,内核通过将其他进程的内存移动到磁盘来尝试释放物理内存。 应用程序没有注意到这一点,除了执行单个汇编程序指令显然需要很长时间。

如果没有足够大的映射空闲区域并且内核拒绝建立映射,则进程中的内存分配失败。 例如,不是所有的虚拟地址都是可用的,因为大多数操作系统将内核映射到某个地址(通常是0x80000000,0xc0000000,0xe0000000或32位体系结构等),所以每个进程的限制可能低于系统限制(例如,即使系统是64位,Windows上的32位进程也只能分配2 GB)。 文件映射(如程序本身和DLL)进一步减少了可用空间。

一个非常一般的理论答案是否定的,不能。 可能在非常奇怪的情况下失败的原因之一就是可用/可分配内存会出现一些奇怪的碎片。 我想知道你是否正在尝试获得(可能是非常小的)性能提升(如果指针== NULL – 类的东西跳过),或者你只是想知道,想讨论它,在这种情况下,你应该使用聊天。

是的,当32位应用程序中的内存空间不足时,内存分配通常会失败(取决于操作系统版本和设置,可能为2,3或4 GB)。 这将是由于内存泄漏。 如果您的操作系统的交换文件空间不足,它也可能会失败。