malloc()在一个无限循环内

我遇到了一个采访问题,当我们在无限循环内使用malloc()分配大块内存并且不free()时,会发生什么情况。

我认为用NULL检查条件应该在堆中没有足够的内存时工作,并且它应该打破循环,但是它没有发生,程序通过打印killed异常终止。

为什么会发生这种情况,以及为什么在没有内存分配的情况下它不执行if部分(我是指malloc()失败时)? 这是什么行为?

我的代码是:

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

int main(void) {
  int *px;

  while(1)
    {
     px = malloc(sizeof(int)*1024*1024);
     if (px == NULL)
       {
        printf("Heap Full .. Cannot allocate memory n");
        break;
       }
     else
       printf("Allocated t");
    }
  return 0;
}

编辑:gcc - 4.5.2(Linux的 - Ubuntu的 - 11.04)


如果你正在linux上运行,请关注第一个终端。 它会显示如下内容:

OOM error - killing proc 1100

OOM意味着内存不足。

我认为它也可以在dmesg和/或/var/log/messages和/或/var/log/system中看到,具体取决于linux发行版。 你可以使用grep:

grep -i oom /var/log/*

你可以让你的程序慢慢抓住内存,并留意:

watch free -m

你会看到可用的交换下降。 当它接近于零时,Linux将会终止你的程序,并且可用内存的数量会再次增加。

这是解释free -m输出的一个很好的链接:http://www.linuxatemyram.com/


这种行为可能是启动我的init或一些其他保护机制(如“神”)的应用程序的问题,您可以进入一个循环,其中linux会终止应用程序,init或某事再次启动它。 如果所需的内存量比可用RAM大得多,则通过将内存页交换到磁盘可能会导致缓慢。

在某些情况下,linux不会杀死导致问题的程序,而是杀死其他进程。 例如,如果它杀死init,机器将重新启动。

在最糟糕的情况下,一个程序或一组进程会请求大量内存(超过Ram的可用内存)并尝试重复访问它。 Linux没有快速放置内存的地方,所以它必须将Ram的某个页面交换到磁盘(交换分区),并加载从磁盘访问的页面,以便程序可以看到/编辑它。

每一毫秒都会发生一遍又一遍。 由于磁盘比RAM慢1000倍,这个问题可能会使机器陷入停顿。


行为取决于限制 - 请参阅http://www.linuxhowtos.org/Tips%20and%20Tricks/ulimit.htm

如果您对内存使用有限制,则会看到预期的NULL返回行为,另一方面,如果您不受限制,则可能会看到您看到的OOM收割器等。


但它并没有发生,程序通过打印死亡而异常终止。

请记住,你并不孤单。 在这种情况下,你被内存不足的杀手所杀,它看到你的进程占用了系统的内存,并且采取了一些步骤来阻止它。

为什么会发生这种情况,以及为什么在没有内存分配的情况下它不执行if部分(我是指malloc()失败时)? 这是什么行为?

那么,没有理由认为if检查没有运行。 查看malloc()的手册页

默认情况下,Linux遵循乐观的内存分配策略。 这意味着当malloc()返回非NULL时,不能保证内存真的可用。 如果事实证明系统内存不足,OOM杀手会杀死一个或多个进程。

所以你认为你用一个NULL检查来保护自己免于内存不足的情况; 在现实中,它只意味着如果你回到NULL ,你不会推断它,这意味着什么,如果你真的得到你请求的内存。

链接地址: http://www.djcxy.com/p/86497.html

上一篇: malloc() inside an infinte loop

下一篇: Maximum memory that can be allocated dynamically and at compile time in c++