2003-12-23 [長年日記]

[Q3] メモリ不足の処理

今まではとにかく近くで捕まえて戻り値で処理するようにしていたのですが、以下のように変えるように決めました*1

  1. 大きなメモリを確保する場合には、近くで捕まえて他のエラーと同様に戻り値で処理する
  2. 小さなメモリを確保する場合には、呼び出しツリーの根元近くでbad_allocを捕まえてプロセスごと終了させる

例外処理をサポートしていないCE3.0以前の環境ではbad_allocを使う代わりにSEHを使って処理してしまおうかと思っています(どっちみちプロセスごと終了させてしまうので、デストラクタが呼ばれない問題は基本的には無視)。

全てのメソッドが例外安全になるように書いてあるわけではないし(そんなことをすると実行時のコストが大きくなりすぎるので)、細かいメモリを確保しようとして失敗した場合には復帰するコード中で再度メモリ確保に失敗する可能性も高いということでプロセスごと終了させます。CE3.0以前ではそのまま不正アクセスさせて殺してしまっても良いのですが、外部から入ってくるデータを扱っていることも多いため攻撃される可能性もないとは言い切れないのでSEHを使ってハンドルして自分からプロセスを終了させるようにします。

例外処理をサポートしていない環境を切り捨てられると実装はもっとシンプルになるのですが、流石にCE3.0も含めて切り捨てるのはちょっと時期尚早でしょう。

*1  とか言いつつまた変えたりしかねないんですが

[]