std::atexit
| ヘッダ <cstdlib>
|
||
int atexit( /*c-atexit-handler*/* func );
int atexit( /*atexit-handler*/* func );
|
で定義 (1) | (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 関数からのreturn)に呼び出すために登録します。
|
これらの関数は、静的オブジェクトの破棄中に、逆順で呼び出されます。すなわち、A が B より前に登録された場合、B の呼び出しは A の呼び出しより前に行われます。これは、静的オブジェクトのコンストラクタと |
(C++11まで) |
|
関数は、静的記憶域期間を持つオブジェクトの破棄、および互いに並行して呼び出される可能性があります。ただし、A の登録が B の登録よりも先行して配列された場合、B の呼び出しは A の呼び出しよりも先行して配列されることが保証されます。これは、静的オブジェクトのコンストラクタと |
(C++11以降) |
同じ関数を複数回登録しても構いません。
関数が例外によって終了した場合、std::terminate が呼び出されます。
atexitはスレッドセーフです。複数のスレッドからこの関数を呼び出してもデータ競合は発生しません。
実装は、少なくとも32個の関数の登録をサポートすることが保証されています。正確な上限は実装定義です。
パラメータ
| func | - | 正常なプログラム終了時に呼び出される関数へのポインタ |
戻り値
0 登録が成功した場合は0、それ以外の場合は0以外の値。
注記
これら2つのオーバーロードは区別されます。なぜなら、パラメータ func の型が異なるためです( language linkage はその型の一部です)。
例
#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ドキュメント
for
atexit
|
|