11

さまざまなアルゴリズムを実験的に評価するように設計された、いくつかのヒューリスティック検索アルゴリズムといくつかのドメインを実装するプログラムがあります。このプログラムは C++ で記述され、GNU ツールチェーンを使用してビルドされ、64 ビットの Ubuntu システムで実行されます。実験を実行するときは、bash のulimitコマンドを使用して、プロセスが使用できる仮想メモリの量を制限し、テスト システムがスワッピングを開始しないようにします。

特定のアルゴリズム/テスト インスタンスの組み合わせが、私が定義したメモリ制限に達しました。ほとんどの場合、プログラムは std::bad_alloc 例外をスローします。この例外はデフォルト ハンドラーによって出力され、その時点でプログラムは終了します。場合によっては、これが発生するのではなく、プログラムが単純にセグメンテーション違反を起こすことがあります。

未処理の std::bad_alloc を報告して終了するのではなく、メモリ不足のときにプログラムが時々 segfault になるのはなぜですか?

4

3 に答える 3

8

1つの理由は、デフォルトで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 に答える