11

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

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

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

4

3 回答 3

8

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

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

于 2010-04-02T16:16:06.907 回答
1

它可能是一些使用 no-throw new 并且不检查返回值的代码。

或者某些代码可能正在捕获异常而不处理它或重新抛出它。

于 2010-04-02T17:27:09.847 回答
0

詹尼布说的。事实上,Linux 默认从不抛出 std::bad_alloc(或从 malloc() 返回 NULL)。

于 2010-04-02T16:39:29.350 回答