为什么 malloc 没有“用完”我计算机上的内存?

问题描述 投票:0回答:3

因此,我有一个分配 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
却会发生变化?

c linux memory-management malloc
3个回答
28
投票

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

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

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

某些平台实现

malloc()
的方式是,在访问该字节(或更可能是一组或“页面”字节中的一个字节)之前,不会发生内存的物理消耗。

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


13
投票
p

之外,您没有使用

NULL
执行任何操作。来自
man malloc

默认情况下,Linux 遵循乐观的内存分配策略。这意味着当
malloc()

返回非

NULL
时,不能保证内存确实可用。万一发现系统内存不足,一个或多个进程将被 OOM Killer 杀死。更多信息请参见
/proc/sys/vm/overcommit_memory
中对
/proc/sys/vm/oom_adj
proc(5)
的描述,以及Linux内核源文件文档
/vm/overcommit-accounting

    


4
投票
calloc

实际上是通过清除内存来触及内存的,并且在许多系统上,内存在被分配到的进程触及之前并未真正分配(因此“用完”)。因此,仅仅执行

malloc
并不会“使用”内存,直到您使用它为止。

† 查看评论

© www.soinside.com 2019 - 2024. All rights reserved.