exit を複数回呼ぶ2012年04月02日 19時51分10秒

exit は C 言語のライブラリ関数。stdlib.h に入っている。

実はこの関数を二回以上呼んだときの動作は不定になっている。実質のところ、運が良ければ何も怒らない。何か起きるとしたらセグメンテーション違反になる。

大雑把に分けると、問題が起きるのマルチスレッドの C++ 環境。C 言語や、シングルスレッドの C++ では起きない。

そして、セグメンテーション違反の理由は既に破棄されたオブジェクトを参照することによって起きる。exit が呼ばれると、プログラムは終了の準備に入る。各種リソースの解放だ。その中の一つに、静的オブジェクトの解放だ。static で広域に割り当てられているオブジェクトが次々に破棄されていく。これを再度参照することによって、すでに解放されているメモリ領域に足を踏み入れることになる。

純粋仮想関数を使っていると、関数の実装が見付からないなどといった、滅多に見ることの無い実行時エラーを見ることも出来る。

シングルスレッドの場合は、exit を呼んだ時点で制御を渡してしまうので、そもそも新たに何かをすることは出来ない。C 言語ではデストラクタが無いので、基本的に起きづらい。

マルチスレッドで、慎重を期したつもりで複数回呼べば大丈夫だと思ったのだろう。まずは、動作も良く判っていない関数の動作と規定を慎重に調べるところから始めた方がいい。