C语言中的Malloc内存消耗行为

时间:2014-06-16 09:11:58

标签: c malloc

我写了这个程序来了解内存消耗模式。

#include <stdio.h>
#include <stdlib.h>

int main()
{
   int i=0;

   while(1 < 2) {
   int *str = (int *) malloc(100000000);

   if(str == NULL) {
      printf("Out of memory.. %d", i);
      return(1);
   }
   printf("Attempt Count = %d\n", i++);

   }

   return(0);
}

在我的系统中,我有8 GB内存。每个malloc调用将尝试存储100MB。所以我期待我的程序会在(10 * 8)循环中崩溃。但柜台远远超过60万。我无法推断出同样的原因。请帮助。

即使考虑所有交换空间和所有交换空间,它也不应该增加超过16GB,这在这里看起来不太可能。

2 个答案:

答案 0 :(得分:4)

那是因为在Linux中,malloc内存尚未使用,因为你没有初始化内存。

你可以malloc超过你拥有的内存(物理+虚拟),因为内核会延迟你的内存分配,直到你真正使用它为止。我相信,为了增加你的程序因内存限制而失败的机会,但这不是问题。

callocmalloc相同,但零会初始化内存。当您向Linux请求内存页面时,Linux已将其初始化为零。因此,如果calloc可以告诉它所要求的内存只是从内核请求的,那么它实际上不必将其初始化为零!由于它没有,因此无法访问该内存,因此它应该能够请求比实际更多的内存。

检查this回答。它提供了一个非常好的解释。

此程序也不会因malloc NULL崩溃而导致空间不足而导致{{1}}。

答案 1 :(得分:1)

在现代操作系统中,进程使用的内存是虚拟内存,不受物理RAM大小的限制。它使用磁盘上的交换空间来允许比RAM大得多的进程。

此外,某些操作系统允许过度使用。您可以分配比交换空间中实际可用的虚拟内存更多的虚拟内存。只有在其中一个进程实际尝试使用过多内存时才会发生失败。