为什么calloc无法在具有4GB RAM的系统上分配1GB?

时间:2012-08-24 23:53:06

标签: c windows memory ram calloc

我呼叫calloc获得1个超过1千兆字节的元素。此调用返回NULL,并且检查errno会显示内存不足错误。但是,在测试期间,我有大约4千兆字节的可用内存,更不用说可用的虚拟内存了。

在研究了这个问题之后,我唯一可以提出的问题是calloc失败的原因是我没有足够的连续的内存可用。然而,在我看来,如果我有4Gb可用内存,它应该很容易有〜= 1Gb连续内存。有没有办法检查连续的内存可用性?如果这是问题,是否有一种直接的方法来“整理”内存?

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

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

1 个答案:

答案 0 :(得分:6)

取得成功的一个重要关键是为您的应用程序提供1GB的虚拟地址空间。对于32位Windows应用程序,默认情况是应用程序以大约2GB的地址空间开始。

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