3

我需要calloc1 个超过 1 GB 的元素。此调用返回NULL,检查 errno 显示内存不足错误。但是,在测试期间,我有将近 4 GB 的空闲 RAM,更不用说可用的虚拟内存了。

在研究了这个问题之后,我唯一能想到的calloc失败原因是我没有足够的连续内存可用。但是,在我看来,如果我有 4Gb 可用内存,那么拥有 ~= 1Gb 连续内存应该很容易。有没有办法检查连续的内存可用性?如果这是问题所在,是否有一种直接的方法来“整理”内存?

或者这是否与分配内存的块大小有关,因此它实际上试图分配比我可用的内存更多的内存?我有哪些选择来确定失败的原因?成功分配这么多内存的选择是什么?

我在具有 12Gb 内存的本机 Windows 系统上。接下来我将尝试在 VM 中运行,并给 VM 几 GB 的内存,并检查虚拟机是否可以非透明地访问足够的连续内存。如果我今天完成,我会在这里发布结果。

4

1 回答 1

6

成功的一个重要关键是为您的应用程序提供 1GB 的虚拟地址空间。对于 32 位 Windows 应用程序,默认情况是应用程序以基本上 2GB 的地址空间启动。

如果您在应用程序失败之前在应用程序中进行了很多分配,那么您很可能已经分配了足够的原始地址空间,以至于没有留下 1GB 的连续地址空间。一个应用程序可以只执行两个小的“策略性放置”分配,这些分配会破坏地址空间,使得剩余部分都小于 1GB。

于 2012-08-25T00:03:23.177 回答