为什么我的程序在内存不足时会偶尔发生段错误而不是抛出std :: bad_alloc?

Bra*_*sen 11 c++ segmentation-fault bad-alloc

我有一个程序实现了几个启发式搜索算法和几个域,旨在通过实验评估各种算法.该程序是用C++编写的,使用GNU工具链构建,并在64位Ubuntu系统上运行.当我运行我的实验时,我使用bash的ulimit命令来限制进程可以使用的虚拟内存量,以便我的测试系统不会开始交换.

某些算法/测试实例组合达到了我定义的内存限制.大多数情况下,程序抛出一个std :: bad_alloc异常,由异常处理程序打印,此时程序终止.偶尔,程序只是段错误而不是这种情况发生.

为什么我的程序在内存不足时偶尔会出现段错误,而不是报告未处理的std :: bad_alloc并终止?

jan*_*neb 8

一个原因可能是默认情况下Linux会过度使用内存.从内核请求内存似乎工作正常,但稍后当你真正开始使用内存时,内核注意到"哦,废话,我的内存不足",调用内存不足(OOM)杀手选择一些内存受害者进程并杀死它.

有关此行为的说明,请参阅http://lwn.net/Articles/104185/