Arantium Maestum

プログラミング、囲碁、読書の話題

Effective C++勉強メモ: Item 8 例外を投げるデストラクタ

例外を投げるデストラクタはUndefined Behaviorになると考えるべき。

デストラクタから例外を投げる可能性のあるオブジェクトを要素に持つvectorが破棄されるときに、同時に複数のExceptionが発生してしまう状況があり得る、というのが非常に納得のいく例。

「そういうコンテナがなくてもundefined behaviorになり得る」と書いてあるが、具体的にはどういう場合だろう。そういうオブジェクトが一つだけでも、特定の条件ではUBになるのか、それともコンテナはないが複数のオブジェクトが破棄されなければいけない状況に限定されるのか。

対処法としては、デストラクタ内で例外が発生する可能性のあることをするなら、発生時に:

  • 即座にプログラムを終了させる
  • デストラクタ内で明示的に例外を無視する

のどちらかをしなければいけない。そして最も重要なのは

  • オブジェクトを使用する側のコードが明示的に(デストラクタに頼らずに)例外を発生させうる処理を行うためのインターフェースを提供する

ということ。例外を適切に扱うには使う側のコンテキストが必要なことが多いので、例外が発生しうる処理はそもそもデストラクタでやるべきではないのかもしれない。