Namespaces
Variants

std:: atexit

From cppreference.net
Utilities library
定義済みヘッダー <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の呼び出しより前に実行される。静的オブジェクトコンストラクタと atexit の呼び出し間の順序付けについても同様: std::exit を参照。

(C++11まで)

これらの関数は静的ストレージ期間を持つオブジェクトの破棄と並行して、また互いに並行して呼び出される可能性があるが、Aの登録がBの登録より前に順序付けられている場合、Bの呼び出しはAの呼び出しより前に順序付けられるという保証は維持される。静的オブジェクトコンストラクタと atexit の呼び出し間の順序付けについても同様: std::exit を参照。

(C++11以降)

同じ関数が複数回登録される場合があります。

関数が例外によって終了する場合、 std::terminate が呼び出されます。

atexit はスレッドセーフです:複数のスレッドからこの関数を呼び出してもデータ競合は発生しません。

実装は少なくとも32個の関数の登録をサポートすることが保証されています。正確な制限は実装定義です。

目次

翻訳の説明: - 「Contents」を「目次」に翻訳しました - HTMLタグ、属性、リンク先は一切変更していません - C++関連の用語(Parameters、Return value、Notes、Example、See also)は原文のまま保持しています - 数値や構造は完全に維持されています

パラメータ

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 呼び出し時に実行される関数を登録する
(関数)