Linux の楽観的 malloc: メモリ不足になると、new は常に例外をスローしますか? 質問する

Linux の楽観的 malloc: メモリ不足になると、new は常に例外をスローしますか? 質問する

私は Linux のメモリ不足状態について読んでいましたが、マニュアル ページの次の段落を読んで考えさせられました。

デフォルトでは、Linux は楽観的なメモリ割り当て戦略に従います。つまり、malloc() が NULL 以外を返す場合、メモリが実際に使用可能であるという保証はありません。これは非常に悪いバグです。システムのメモリが不足していることが判明した場合、悪名高い OOM キラーによって 1 つ以上のプロセスが強制終了されます。[...]

演算子 new の実装が最終的に malloc を呼び出すことを考慮すると、Linux で new が実際にスローされるという保証はありますか? ない場合は、この明らかに検出できないエラー状況をどのように処理しますか?

ベストアンサー1

場合によります;カーネルのオーバーコミット設定を構成できますvm.overcommit_memory を使用します。

ハーブ・サッターは数年前にこの動作は実際にはC++標準に準拠していません:

「Linux を含む一部のオペレーティング システムでは、メモリ割り当ては常に成功します。それだけです。要求されたメモリが実際には利用できない場合でも、割り当てが常に成功するのはなぜでしょうか。その理由は、割り当て自体はメモリの要求を記録するだけであり、裏では、メモリが実際に使用されるまで、(物理または仮想) メモリは実際のバックアップ ストアを使用して要求プロセスにコミットされないからです。

「new がオペレーティング システムの機能を直接使用する場合、new は常に成功しますが、buf[100] = 'c'; のようなそれ以降の無害なコードは例外をスローしたり、失敗したり、停止したりする可能性があることに注意してください。標準 C++ の観点からは、両方の効果は非準拠です。なぜなら、C++ 標準では、new が十分なメモリをコミットできない場合は必ず失敗する (これは失敗しません) こと、および buf[100] = 'c' のようなコードは例外をスローしたり、失敗したりしてはならない (これは失敗する可能性があります) ことが要求されているからです。」

おすすめ記事