为什么malloc()或new永远不会返回NULL?

我正在编写一个应用程序,需要大量内存用于缓存目的,正如我在此描述的那样。 现在我正在玩一些malloc / new结构来弄清楚我是如何实现它的。 我做了一个奇怪的观察:

#include  #include  int main(void) { while(1) { char *foo = (char*)malloc(1024);// new char[1024]; if(foo == NULL) { printf("Couldn't alloc\n"); fflush(stdout); return 0; } } return 0; } 

为什么永远不会达到printf? 如果我的系统内存不足,则称malloc返回NULL,如此处所述。 但我总是收到SIGKILL(我正在使用linux ……)。

默认情况下,Linux通常使用机会内存分配方案,这意味着内核将为您提供一个在首次使用之前不会分配的有效地址。

看到:

  • SIGKILL在分配内存时
  • Linux上的C程序耗尽内存

根据这些响应,您可以使用echo 2 > /proc/sys/vm/overcommit_memory关闭此function。

据我所知,这是在你不必使用你分配的所有内存的假设下完成的。 我不能说我个人曾经分配过至少一次我没有碰过的空间,所以我很想知道这会影响现实生活中的表现……

关于SIGKILL失败,您调用的每个malloc仍然为每个调用分配一些内存。 最终你可能会用malloc开销填满你的记忆,从而唤起内存终止杀戮function的愤怒。 是否仅仅是这个问题,或者过度使用政策是否仍然分配了一小部分所需空间是一个很好的问题。

通常,Linux会根据您的请求分配尽可能多的(虚拟)内存,并且只在需要时为其分配物理内存。 如果系统耗尽了物理内存,那么它会开始终止进程​​以释放一些内存。

这意味着malloc将成功,除非请求是荒谬的,但您的进程(或其他)可能会因使用内存而被杀死。

有关更多详细信息,请参阅malloc的联机帮助页及其参考:

默认情况下,Linux遵循乐观的内存分配策略。 这意味着当malloc()返回非NULL ,无法保证内存确实可用。 如果事实certificate系统内存不足,那么一个或多个进程将被OOM杀手杀死。 有关更多信息,请参阅proc(5) / proc / sys / vm / overcommit_memory和/ proc / sys / vm / oom_adj的说明以及内核源文件Documentation / vm / overcommit-accounting。

(当然,除非你使用无投掷版本,否则new不会返回null)。

如果无法满足请求的分配, malloc将返回NULL但也许你应该尝试从堆中分配大量的空间。

看到这里 。

在linux上,调用malloc()时获取错误的唯一方法是禁用内存过量使用。 在常规的Linux系统上,这是malloc()返回NULL的唯一方法。 如果一个icecast进程达到了这一点,它就会搞砸了,无论如何它都无法做任何有意义的事情:任何源读取都会失败(refbuf alloc),任何日志打印也会失败(printf也会使用malloc),所以它也可以放弃并调用abort()。

如果操作系统让你的程序运行那么长,Malloc将返回NULL。 但在malloc获得运行操作系统的机会之前就会杀死你的进程。

就像它检测到你正在写入分配给你的进程的内存页面一样,它会杀死你的进程。