例外処理メカニズムが正しく機能せず、void terminate() の呼び出しが起きるケースもあります。
この terminate() 呼び出しは、次のいずれかの状況で行われます。
extern "C" printf(char* ...); #include <exception> #include <cstdlib> using namespace std; void f() { printf("Function f()¥n"); throw "Exception thrown from f()"; } void g() { printf("Function g()¥n"); } void h() { printf("Function h()¥n"); } void my_terminate() { printf("Call to my_terminate¥n"); abort(); } int main() { set_terminate(my_terminate); atexit(f); atexit(g); atexit(h); printf("In main¥n"); }
次に、上記の例の出力を示します。
In main Function h() Function g() Function f() Call to my_terminate
atexit() を使用して関数を登録するには、atexit() へのパラメーターに 、登録したい関数を指すポインターを渡します。 プログラムが正常に終了したときには、atexit() は、引き数のない登録済み関数を逆順で呼び出します。 atexit() 関数は、<cstdlib> ライブラリーに入っています。
terminate() 関数は、terminate_handler によって指示された関数を呼び出します。 デフォルトにより、terminate_handler は、プログラムを終了するための関数 abort() を指します。 terminate_handler のデフォルト値を、関数 set_terminate() に置き換えることができます。
終了関数は、return を使用しても、例外をスローすることによっても、 呼び出し元に戻ることはできません。
関連参照