Namespaces
Variants

std::atexit

ja.cppreference.net より
 
 
ユーティリティライブラリ
言語サポート
型サポート (基本型、RTTI)
ライブラリ機能テストマクロ (C++20)
プログラムユーティリティ
可変引数関数
コルーチンサポート (C++20)
契約サポート (C++26)
三者比較
(C++20)
(C++20)(C++20)(C++20)    
(C++20)(C++20)(C++20)

汎用ユーティリティ
関係演算子 (C++20で非推奨)
整数比較関数
(C++20)(C++20)(C++20)    
(C++20)
swap および 型操作
(C++14)
(C++11)
(C++11)
(C++11)
(C++17)
共通語彙型
(C++11)
(C++17)
(C++17)
(C++17)
(C++11)
(C++17)
(C++23)



 
 
ヘッダ <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 の呼び出しより前に行われます。これは、静的オブジェクトのコンストラクタと atexit の呼び出しの順序についても同様です。std::exit を参照してください。

(C++11まで)

関数は、静的記憶域期間を持つオブジェクトの破棄、および互いに並行して呼び出される可能性があります。ただし、A の登録が B の登録よりも先行して配列された場合、B の呼び出しは A の呼び出しよりも先行して配列されることが保証されます。これは、静的オブジェクトのコンストラクタと atexit の呼び出しの間の配列についても同様です。std::exit を参照してください。

(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)
完全なクリーンアップなしで高速なプログラム終了を引き起こす
(関数)
std::quick_exit 呼び出し時に実行される関数を登録する
(関数)