c语言 - 为什么 malloc 不"using up"我电脑上的内存?



所以我有这个程序,它分配了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会更改?

malloc()不使用

内存。 它分配它。

分配

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

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

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

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

内存可能不是真正可用,尤其是您在示例中没有使用p做任何事情,除了检查它是否NULL。从男人马洛克

默认情况下,Linux 遵循乐观的内存分配策略。这意味着当malloc()返回非NULL时,无法保证内存确实可用。如果事实证明系统内存不足,一个或多个进程将被 OOM 杀手杀死。有关详细信息,请参阅 proc(5)/proc/sys/vm/overcommit_memory/proc/sys/vm/oom_adj的说明和 Linux 内核源文件文档/vm/overcommit-accounting

系统上

calloc†实际上通过清除内存来接触内存,并且在许多系统上,内存并没有真正分配(因此"用完"),直到它被分配到的进程触及。因此,仅仅执行malloc操作不会"使用"内存,直到您使用它。

† 查看评论

相关内容

  • 没有找到相关文章

最新更新