运行 无限循环中的 malloc()

Running malloc() in an infinite loop

Malloc 函数成功时 returns 指向分配的内存位置的指针,失败时 returns 空值。如果我将 malloc() 放入一个无限循环中,这个循环会停止吗? malloc() 分配了整个可用内存后,它会停止执行还是只返回空值?

以这种方式重复调用 malloc 只会永远返回空指针。 (但是,如果您尝试使用该空指针,您当然会遇到段错误)。

这与 C++ 中的 new 不同,后者在无法分配新内存时抛出 bad_alloc

在 Linux,就像在银行一样。流程可以一起借用比可用的更多的东西,但这没关系,除非他们尝试使用它。只有这样,内核才会使用实际内存(或一块交换分区)对其进行备份。如果所有实内存和交换分区都用完了,内核应该运行 OOM(Out of Memory Killer)并首先找到罪魁祸首。

如果我只是 malloc 而没有尝试使用它,内核让我继续生活,但我开始从 malloc 获取 NULL:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char **argv)
{ while(1){ printf("%lu\n",(long unsigned)malloc(1024*1024*1024)); } }

输出:

140725756837904
140724683091984
140723609346064
140722535600144
0
0
0
0
0
0
...

这本身不会导致任何东西的交换,因为我只是得到(可能无法实现的)内存承诺,并且在我通过尝试用那些返回的指针。