为什么malloc不是“用尽”我的电脑上的内存?

所以我有这个程序,分配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呢?

Solutions Collecting From Web of "为什么malloc不是“用尽”我的电脑上的内存?"

malloc()不使用内存。 它分配它。

分配内存后,通过分配一些数据来使用它。

 size_t Size = 256 * 1024 * 1024; p = malloc(Size); if (p != NULL) { memset(p, 123, Size); } 

一些平台实现malloc()是这样一种方式,物理内存消耗不会发生,直到该字节(或更可能是一个组内的字节或字节“页”)访问。

calloc()可能也可能不会真正使用内存。 一个系统可以大量内存映射到同一个物理归零内存,至少在数据变得有趣之前。 看看为什么malloc + memset比calloc慢?

内存可能不是真的可用,特别是你没有做任何使用p在你的例子,除非检查是否为NULL 。 从男人malloc

默认情况下,Linux遵循乐观的内存分配策略。 这意味着当malloc()返回非NULL ,不能保证内存真的可用。 如果事实证明系统内存不足,OOM杀手会杀死一个或多个进程。 有关更多信息,请参阅proc(5) /proc/sys/vm/oom_adj/proc/sys/vm/oom_adj以及Linux内核源文件Documentation /vm/overcommit-accounting

系统上的calloc实际上通过清除内存来触及内存,而在许多系统上,内存并没有被真正分配(并因此被“用完”),直到被分配进程触及为止。 所以只是做malloc不会“使用”内存,直到你,使用它。

† 看评论