std::atexit
From cppreference.com
| ヘッダ <cstdlib> で定義 |
||
| (1) | ||
int atexit( /* c-atexit-handler */* func ); int atexit( /* atexit-handler */* func ); |
(C++11まで) | |
| int atexit( /* c-atexit-handler */* func ) noexcept; int atexit( /* atexit-handler */* func ) noexcept; |
(C++11以降) | |
| extern "C" using /* c-atexit-handler */ = void(); extern "C++" using /* atexit-handler */ = void(); |
(2) | (説明用*) |
func が指す関数を、正常なプログラム終了時(std::exit() による終了、または main 関数からの復帰)に呼び出されるように登録します。
|
関数は、静的オブジェクトの破棄中に、逆順で呼び出されます。A が B より先に登録された場合、B の呼び出しが A の呼び出しより先に行われます。静的オブジェクトのコンストラクタと |
(C++11まで) |
|
関数は、静的記憶域期間を持つオブジェクトの破棄や、他の関数と並行して呼び出される可能性があります。ただし、A の登録が B の登録より前に順序付けられている場合、B の呼び出しが A の呼び出しより前に順序付けられるという保証が維持されます。静的オブジェクトのコンストラクタと |
(C++11以降) |
同じ関数を複数回登録できます。
関数が例外をスローして終了した場合、std::terminate が呼び出されます。
atexit はスレッドセーフです。複数のスレッドからこの関数を呼び出しても、データ競合は発生しません。
実装では、少なくとも 32 個の関数の登録がサポートされることが保証されています。正確な制限は実装定義です。
目次 |
[編集] パラメータ
| func | - | 正常なプログラム終了時に呼び出される関数へのポインタ |
[編集] 戻り値
0 登録が成功した場合、それ以外の場合は非ゼロの値。
[編集] 注
2つのオーバーロードは、パラメータ func の型が異なるため(言語リンケージはその型の要素です)、区別されます。
[編集] 例
このコードを実行
#include <cstdlib> #include <iostream> void atexit_handler_1() { std::cout << "At exit #1\n"; } void atexit_handler_2() { std::cout << "At exit #2\n"; } int main() { const int result_1 = std::atexit(atexit_handler_1); const int result_2 = std::atexit(atexit_handler_2); if (result_1 || result_2) { std::cerr << "Registration failed!\n"; return EXIT_FAILURE; } std::cout << "Returning from main...\n"; return EXIT_SUCCESS; }
出力
Returning from main... At exit #2 At exit #1
[編集] 関連項目
| (クリーンアップせずに)異常なプログラム終了を引き起こす (関数) | |
| クリーンアップを伴う通常のプログラム終了を引き起こす (関数) | |
| (C++11) |
完全なクリーンアップを行わずに、高速なプログラム終了を引き起こす (関数) |
| (C++11) |
std::quick_exit の呼び出し時に呼ばれる関数を登録する (関数) |
| C のドキュメント (atexit)
| |