2010-04-02 154 views
11

我有一个程序,实现几个启发式搜索算法和几个域,旨在通过实验评估各种算法。该程序使用C++编写,使用GNU工具链构建,并在64位Ubuntu系统上运行。当我运行我的实验时,我使用bash的ulimit命令来限制进程可以使用的虚拟内存量,以便我的测试系统不会开始交换。为什么我的程序在内存不足时偶尔会发生段错误,而不是抛出std :: bad_alloc?

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

为什么当内存不足,而不是报告未处理的std :: bad_alloc的和终止我的程序偶尔段错误?

+0

段错误不仅可造成的,因为你打的内存 – Andrey 2010-04-02 16:09:29

+0

限制,我很清楚。在我看到段错误的情况下,该过程一直在使用接近我指定限制的内存量。我非常有信心,我看到的段错误不是由于我的代码中的错误。 – 2010-04-02 16:37:57

+1

您是否考虑过在GDB中简单运行(以及其中的几个),以查看哪些代码段错误? – Shiroko 2010-04-02 17:01:15

回答

8

其中一个原因可能是由默认的Linux overcommits内存。从内核请求内存看起来可以正常工作,但后来当你真正开始使用内存时,内核注意到“哦,废话,我内存不足”,调用内存不足(OOM)杀手,受害者进程并杀死它。

对于此行为的描述,请参阅http://lwn.net/Articles/104185/

+0

可能。一些更多的信息,我一直在作为测试系统上唯一拥有48GB内存的用户运行。我一直在运行一个47GB的虚拟内存ulimit,这应该为操作系统留下大量的核心内存。链接的文章是从2004年开始的。它今天仍然有用吗? – 2010-04-02 16:40:17

1

说什么janneb。事实上,Linux默认从不抛出std :: bad_alloc(或从malloc()返回NULL)。

+0

我假设你的意思是“std :: bad_alloc从不默认在Linux上抛出”。那么,为什么当程序达到内存限制时,我会在几个Linux系统上看到std :: bad_alloc从C++程序中抛出? – 2010-04-02 16:44:57

+0

另外,我认为你的意思是'malloc'而不是'free'。 malloc的Linux手册页不会让它听起来像NULL永远不会被返回。 – 2010-04-02 16:47:24

+0

@Bradford。你当然是对的。固定。 – 2010-04-02 16:56:40

1

它可以不使用抛出新的,不检查返回值是一些代码。

或者一些代码可以捕捉异常,而不是处理,或重新抛出它。

相关问题