在无限循环中运行malloc()

问题描述:

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

+5

你尝试过会发生什么? –

+3

你试过了吗? (你应该!) – Amit

+1

@apoorvasomani那么/为什么你问这个问题呢? –

在Linux上,就像在银行。进程可以共同借用比可用的更多的东西,但是除非他们尝试使用它,否则它们是可以的。只有这样内核才能用真实内存(或一块交换分区)来备份它。如果所有的真实内存和交换分区都用尽了,内核应该运行OOM(内存不足杀手)并首先得到罪魁祸首。

如果我只是不malloc试图使用它,内核可以让我的生活,但我通过malloc开始越来越空值:

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

仅凭这一点不会导致交换任何东西,因为我只是得到(可能无法实现的)内存承诺,并且它没有被真实内存备份,直到我通过尝试使用那些返回的指针来执行内核来保持内核的承诺。

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

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

+0

取消指针NULL指针通常倾向于这样做,无论它们如何获得。 :d – PSkocik