在无限循环中运行malloc()
问题描述:
成功时的malloc函数返回指向分配的内存位置的指针,并在失败时返回空值。如果我把malloc()放在一个无限循环中,这个循环会停止吗?在malloc()分配完整的内存之后,它会停止执行还是继续返回空值?在无限循环中运行malloc()
答
在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
你尝试过会发生什么? –
你试过了吗? (你应该!) – Amit
@apoorvasomani那么/为什么你问这个问题呢? –