因此,我有一个分配 256 MB 内存的程序,在用户按 ENTER 键后,它会释放内存并终止。
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *p, s[2];
p = malloc(256 * 1024 * 1024);
if ( p == NULL)
exit(1);
printf("Allocated");
fgets(s, 2, stdin);
free(p);
return 0;
}
我多次运行该程序并将每个程序置于后台,直到不再有足够的内存可分配为止。然而,这种情况永远不会发生。我运行了一个 linux
top
命令,即使多次运行该程序,可用内存也从未减少近 256 MB。
但是,另一方面,如果我使用
calloc
而不是 malloc
那么就会有巨大的差异:
p = calloc(256 * 1024 * 1024, 1);
现在,如果我运行该程序并将其置于后台,然后重复,每次运行它时,可用内存都会减少 256 MB。为什么是这样?为什么
malloc
不会导致可用内存发生变化,但 calloc
却会发生变化?
calloc
实际上是通过清除内存来触及内存的,并且在许多系统上,内存在被分配到的进程触及之前并未真正分配(因此“用完”)。因此,仅仅执行
malloc
并不会“使用”内存,直到您使用它为止。† 查看评论