std::atexit
提供: cppreference.com
<tbody>
</tbody>
<tbody class="t-dcl-rev t-dcl-rev-num ">
</tbody><tbody>
</tbody>
| ヘッダ <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 /*atexit-handler*/ = void(); // exposition-only extern "C" using /*c-atexit-handler*/ = void(); // exposition-only |
(2) | |
(std::exit() または main 関数から戻ることによって) プログラムが正常終了したときに呼ばれるように func の指す関数を登録します。
|
関数は静的オブジェクトの破棄中に逆順で呼ばれます。 A が B より前に登録された場合、 B の呼び出しは A の呼び出しより前に行われます。 同じことが静的オブジェクトのコンストラクタと |
(C++11未満) |
|
関数は静的記憶域期間を持つオブジェクトの破棄とお互い並行的に呼ばれる可能性があります。 A の登録が B の登録に対して先行配列された場合、 B の呼び出しは A の呼び出しに対して先行配列されることが保証されます。 同じことが静的オブジェクトのコンストラクタと |
(C++11以上) |
同じ関数を2回以上登録しても構いません。
関数が例外で終了した場合は、 std::terminate が呼ばれます。
atexit はスレッドセーフです。 複数のスレッドから呼んでもデータ競合を発生しません。
処理系は少なくとも 32 個の関数の登録をサポートすることが保証されています。 正確な制限は処理系定義です。
引数
| func | - | プログラムの正常終了時に呼ばれる関数を指すポインタ |
戻り値
登録に成功した場合は 0、そうでなければ非ゼロの値。
ノート
引数 func の型が異なるため (言語リンケージは型の一部です)、2つのオーバーロードは異なります。
例
Run this code
#include <iostream>
#include <cstdlib>
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 != 0) or (result_2 != 0)) {
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) |
quick_exit が呼ばれた時に呼ばれる関数を登録します (関数) |
atexit の C言語リファレンス
| |