为什么malloc没有"耗尽"我电脑上的内存?

Rya*_*yan 12 c linux malloc memory-management

所以我有这个程序分配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;
}
Run Code Online (Sandbox Code Playgroud)

我多次运行这个程序并对每个程序进行后台处理,直到没有足够的内存可以分配.但是,这从未发生过.我运行了一个linux top命令,甚至在多次运行这个程序之后,空闲内存永远不会下降到256 MB.

但是,另一方面,如果我使用calloc而不是malloc那时有一个巨大的差异:

p = calloc(256 * 1024 * 1024, 1);

现在,如果我运行该程序并对其进行后台处理,并重复,每次运行它时,可用内存将减少256 MB.为什么是这样?为什么不会malloc导致可用的可用内存发生变化,但是calloc呢?

chu*_*ica 23

malloc()使用内存.它分配它.

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

size_t Size = 256 * 1024 * 1024;
p = malloc(Size);
if (p != NULL) {
  memset(p, 123, Size);
}
Run Code Online (Sandbox Code Playgroud)

某些平台实现malloc()的方式是,在访问该字节(或更可能是组内的字节或字节的"页")之前,不会发生内存的物理消耗.

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

  • 你的幸运号码是123吗?256 MB 123 123 123 123 ...一定很幸运! (3认同)
  • 当然应该是42 (2认同)

Yu *_*Hao 12

内存可能不是真的可用,特别是你没有p在你的例子中做任何事情,除了检查它是否NULL.来自man malloc

默认情况下,Linux遵循乐观的内存分配策略.这意味着当malloc()返回非时NULL,不能保证内存确实可用.如果事实证明系统内存不足,那么一个或多个进程将被OOM杀手杀死.欲了解更多信息,请参阅的说明/proc/sys/vm/overcommit_memory,并/proc/sys/vm/oom_adjproc(5)和Linux内核源代码文件文档/vm/overcommit-accounting.


Ark*_*kku 5

在您的系统上calloc,\xe2\x80\xa0 实际上通过清除内存来触及内存,并且在许多系统上,内存并未真正分配(因此 \xe2\x80\x9 被占用\xe2\x80\x9d),直到它被它被分配到的进程。因此,仅仅这样做malloc不会 \xe2\x80\x9cuse\xe2\x80\x9d 内存,直到你使用它。

\n\n

\xe2\x80\xa0 查看评论

\n

  • 我认为`calloc()`在某些系统上也可以作弊http://stackoverflow.com/questions/2688466/why-mallocmemset-is-slower-than-calloc?rq=1 (4认同)