2013-02-20 12 views
9

EOutOfMemory例外をキャッチした後、実行を続行するのは理にかなっていますか、またはヒープまたはスタックが高い確率で破損していますか?EOutOfMemory例外はリカバリ可能ですか?

ワイルドアドレスへの書き込みなど、以前のメモリ破損によるEOutOfMemoryの場合を意味しません。GetMemを呼び出し、EOutOfMemoryをキャッチする正しいコードを意味します。

+0

ある場合があります。私はWin32アプリケーションで3GBのメモリバッファを割り当てようとしている人々を見た:-) これは、エラーを得る前に実際に何をしようとしたかによって異なります。回復可能な場合もあります。 –

答えて

6

私の意見では、EOutOfMemoryから続けるつもりはありません。私の経験では、ヒープが破損し、将来のエラーが予想される可能性が非常に高いです。通常、最も安全な方法はプロセスを終了させることです。

+0

回復できないと思われますが、わかりません。私はFastMMの内部とWindowsのメモリ管理については知らない。 – kludg

+1

私たちのサーバーでは、EOutOfMemoryでリリースされた初期化時にメモリを要求しています。そのため、プロセスを終了する前に、例外やその他のログには機動力があります。 –

+0

@ MarjanVenema少なくとも、あなたの他のコードが破損したヒープを使用する場合、それは危険です。 Delphi RTLは起動時に単一の 'EOutOfMemory'インスタンスを割り当て、例外を発生させるためにヒープ割り当てを行う必要がないことに注意してください。 –

1

一般的に、私は回復しようとしても意味がないことに同意します。しかし、それは特定の状況において有用であり得る。たとえば、ユーザーの選択に依存する大量のメモリを割り当てることができます。失敗した場合は、元に戻って別の設定で再試行できます。ポイントクラウドを3Dメッシュに変換するためにこれを行います。これには、メモリ要件が事前にわかっていないいくつかのステップが含まれています。それは、即時でクリーンなバックアウトパスを使用して、回復可能にしたいステップを慎重にコーディングするだけです。たとえば、私のデータ構造の中には、断片化されたメモリの問題を最小限に抑えるために、各行が別々に割り当てられたビットマップまたはバッファがあります。コンストラクタはtry ... except handlingとEOutOfMemory例外をスローし、デストラクタはすでに割り当てられた行を解放します。私はそれがいつもうまくいくかどうかは保証できませんが、それは十分な価値があるほどうまく機能しています。

関連する問題