C++ 为什么我的程序在内存不足时会偶尔出错,而不是抛出std::bad_alloc?

C++ 为什么我的程序在内存不足时会偶尔出错,而不是抛出std::bad_alloc?,c++,segmentation-fault,bad-alloc,C++,Segmentation Fault,Bad Alloc,我有一个程序,实现了几个启发式搜索算法和几个领域,旨在实验评估各种算法。该程序是用C++编写的,使用GNU工具链构建,并运行在64位Ubuntu系统上。当我运行我的实验时,我使用bash的ulimit命令来限制进程可以使用的虚拟内存量,这样我的测试系统就不会开始交换 某些算法/测试实例组合达到了我定义的内存限制。大多数情况下,程序抛出一个std::bad_alloc异常,该异常由默认处理程序打印,程序在该点终止。偶尔,程序只是简单地对故障进行分段,而不是发生这种情况 为什么我的程序在内存不足时会

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

某些算法/测试实例组合达到了我定义的内存限制。大多数情况下,程序抛出一个std::bad_alloc异常,该异常由默认处理程序打印,程序在该点终止。偶尔,程序只是简单地对故障进行分段,而不是发生这种情况


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

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


有关此行为的描述,请参见janneb所说的内容。事实上,Linux默认情况下从不抛出std::bad_alloc(或从malloc()返回NULL)。

可能是一些代码使用no throw new而不检查返回值


或者某些代码可能捕捉到异常,而没有处理它或重新刷新它。

SEGFULT可能是由以下原因引起的,这不仅是因为您达到了内存限制,而且我非常清楚。在我看到segfault的情况下,进程使用的内存量接近我指定的限制。我很有信心我看到的seg错误不是由于我的代码中的错误造成的。你有没有考虑过在GDB中运行一个简单的程序(当然也有一些)来看看代码的哪一部分seg错误?可能吧。更多信息,我是测试系统上唯一的用户,该系统有48GB内存。我一直在使用47GB的虚拟内存ulimit,它应该为操作系统留下足够的核心内存。这篇文章的链接来自2004年。它在今天仍然相关吗?我想你的意思是“在Linux上默认情况下从不抛出std::bad_alloc”。那么,为什么当程序达到内存限制时,我看到了在几个Linux系统上从C++程序中抛出的STD:BADYOLL?我想你是说“代码> MaloC”而不是< /COD> FALE。malloc的Linux手册页并没有让它听起来像是永远不会返回NULL。看看这条线索:我认为,即使过度投入,如果你要求的上限超过它知道永远无法满足的上限,或者如果你要求的上限超过虚拟内存空间中剩余的上限,linux也会很快失败(我认为这在64位系统上是非常罕见的),或者超过可以在地址空间中连续保留的数量(同样,在64位系统上也不会发生意外)。当然,我可能错了。@史蒂夫,这是很久以前的事了,但是IIRC,在我的x86_64桌面上,有8 GB RAM,我的简单测试程序分配了内存,但从未接触过内存,在malloc()返回NULL之前,它能够分配大约90 GB的内存。