如何在ubuntu上捕获内存不足的异常

Eth*_*hen 0 c++ exception out-of-memory ubuntu-12.04

我试图通过以下函数捕获内存不足异常:

void allocMemory(buffer& thebuf, size_t size)
{
try
{
         thebuf = buffer(size); // new char[] here
}
catch(bad_alloc& ex)
{
     exception handling... // print some information
         exit(1);
}
}
Run Code Online (Sandbox Code Playgroud)

处理应显示一些信息并关闭程序.这在Windows上运行良好,但在Linux上程序只是直接关闭终端上的"Killed".似乎OOM杀手在异常被捕获之前杀死了我的程序.

这是正常的吗?

如何在Linux上捕获内存不足?

PS我正在测试ubuntu 12.04 64位,仅使用4GB内存进行测试,没有交换空间,语言是C++.此外,如果我一次新增大量内存,该功能在Linux上运行.但是,如果我每次都做一点新事(例如:在循环中),程序将最终关闭终端上的"Killed"

任何帮助,将不胜感激.

n. *_* m. 6

在Linux上,你不会得到任何bad_alloc异常(除非你在shell中更改了一些默认值).

Linux使用延迟分配策略.任何分配请求(当不是太大时)都会成功.操作系统将返回未映射到虚拟内存的地址.当程序实际尝试使用内存时,映射会发生.只有在这一点上才能检测到内存不足的情况.

但是,当发生这种情况时,将条件报告给程序为时已晚.它没有准备好处理它.因此操作系统只会直接杀死程序.

谷歌linux内存杀手为(很多)提供更多信息.

您可以使用该rlimit命令限制程序可用的内存量.将其设置得足够低,以便程序在耗尽所有可用内存之前达到限制.

如果需要,您还可以在系统范围内禁用延迟分配行为,但这很少是一件好事.