在无限循环中运行malloc()

时间:2015-07-12 21:42:35

标签: c malloc

成功时的Malloc函数返回指向已分配内存位置的指针,并在失败时返回null值。如果我把malloc()放在一个无限的while循环中,这个循环会不会停止?在malloc()分配可用的整个内存之后,它会停止执行还是只是继续返回空值?

2 个答案:

答案 0 :(得分:4)

以这种方式重复调用malloc将永远保持返回空指针。 (但是,如果你尝试使用那个空指针,你当然会得到一个段错误。)

这与C ++中new的行为不同,如果它不能分配新内存,则会抛出bad_alloc

答案 1 :(得分:3)

在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
...

这一点不会导致任何事情的交换,因为我只是获得了(可能是无法补偿的)内存承诺,并且在我将内核保留给那个承诺之前它不会被真实内存备份通过尝试用返回的指针做事。