名前空間
変種
操作

std::exit

提供: cppreference.com
< cpp‎ | utility‎ | program
 
 
 
 
ヘッダ <cstdlib> で定義
             void exit( int exit_code );
(C++11以前)
[[noreturn]] void exit( int exit_code );
(C++11およびそれ以降)

プログラムの正常終了を発生させます。

いくつかのクリーンアップステップが行われます。

1) 静的記憶域期間を持つオブジェクトのデストラクタがそのコンストラクタの完了または動的初期化の完了の逆順で呼ばれ、 std::atexit に渡された関数が登録されたのと逆順で (最後のものが最初に) 呼ばれます。
a) 何らかの関数 F に対する std::atexit の呼び出しより前に初期化が完了したあらゆる静的オブジェクトは、プログラム終了処理中の F の呼び出しより後に破棄されます。
b) 何らかの関数 F に対する std::atexit の呼び出しより後に構築が開始されたあらゆる静的オブジェクトは、プログラム終了処理中の F の呼び出しより前に破棄されます (これは静的オブジェクトのコンストラクタから std::atexit が呼ばれた場合も含みます)。
(C++11以前)
1) 現在のスレッドに紐付けられているスレッドローカル記憶域期間を持つオブジェクトのデストラクタ、静的記憶域期間を持つオブジェクトのデストラクタ、および std::atexit で登録された関数が、以下の保証を維持しつつ、並行的に実行されます。
a) スレッドローカルオブジェクトの最後のデストラクタは静的オブジェクトの最初のデストラクタに対して先行配列されます。
b) スレッドローカルオブジェクトまたは静的オブジェクト A のコンストラクタまたは動的初期化の完了がスレッドローカルオブジェクトまたは静的オブジェクト B に対して先行配列された場合、 B の破棄の完了は A の破棄の開始に対して先行配列されます。
c) 静的オブジェクト A の初期化の完了が何らかの関数 F に対する std::atexit の呼び出しに対して先行配列された場合、終了処理中の F の呼び出しは A の破棄の開始に対して先行配列されます。
d) 何らかの関数 F に対する std::atexit の呼び出しが静的オブジェクト A の初期化の完了に先行配列された場合、 A の破棄の開始は終了処理中の F の呼び出しに対して先行配列されます。
e) 何らかの関数 F1 に対する std::atexit の呼び出しが何らかの関数 F2 に対する std::atexit の呼び出しに対して先行配列された場合、終了処理中の F2 の呼び出しは F1 の呼び出しに対して先行配列されます。
(C++11およびそれ以降)
  • 上記において、
  • atexit で登録されたいずれかの関数またはいずれかの静的/スレッドローカルオブジェクトのデストラクタが例外を投げた場合は、 std::terminate が呼ばれます。
  • コンパイラがオブジェクトの動的初期化を非ローカル初期化の静的初期化フェーズに格上げすることを選んだ場合、破棄の順序付けはそれが動的初期化であったかのように行われます。
  • 関数ローカル (ブロックスコープ) な静的オブジェクトが破棄され、別の静的オブジェクトのデストラクタからその関数が呼ばれ、そのオブジェクトの定義を制御の流れが通過する場合 (またはポインタや参照を通して間接的にそれが使用される場合)、動作は未定義です。
  • クラスまたは配列の部分オブジェクトの構築中に関数ローカル (ブロックスコープ) な静的オブジェクトが初期化された場合、それはそのクラスまたはその配列のすべての要素のすべての部分オブジェクトが破棄された後にのみ破棄されます。
2) すべての C のストリームがフラッシュされ閉じられます。
3) std::tmpfile によって作成されたファイルが削除されます。
4) 制御がホスト環境に返されます。 exit_code0 または EXIT_SUCCESS であれば、成功終了を表す処理系定義のステータスが返されます。 exit_codeEXIT_FAILURE であれば、失敗終了を表す処理系定義のステータスが返されます。 それ以外の場合は、処理系定義のステータス値が返されます。

スタックは巻き戻されません。 自動記憶域期間を持つ変数のデストラクタは呼ばれません。

目次

[編集] main 関数との関係

return 文または関数の終わりへの到達のいずれかによって main 関数から戻ると、通常の関数の終了を行い (自動記憶域期間の変数のデストラクタを呼び)、その後 return 文の引数 (または暗黙の return が使用された場合は 0) を exit_code として渡して std::exit を実行します。

[編集] 引数

exit_code - プログラムの終了ステータス

[編集] 戻り値

(なし)

[編集]

#include <iostream>
#include <cstdlib>
 
class Static {
public:
 
    ~Static() 
    {
        std::cout << "Static dtor\n";
    }
};
 
class Local {
public:
    ~Local() 
    {
        std::cout << "Local dtor\n";
    }
};
 
Static static_variable; // dtor of this object *will* be called
 
void atexit_handler()
{
    std::cout << "atexit handler\n";
}
 
int main()
{
    Local local_variable; // dtor of this object will *not* be called
    const int result = std::atexit(atexit_handler); // handler will be called
 
    if (result != 0) {
        std::cerr << "atexit registration failed\n";
        return EXIT_FAILURE;
    }
 
    std::cout << "test\n";
    std::exit(EXIT_FAILURE);
}

出力:

test
atexit handler
Static dtor

[編集] 関連項目

(クリーンアップせずに) プログラムを異常終了させます
(関数) [edit]
std::exit が呼ばれたときに呼ばれる関数を登録します
(関数) [edit]
完全なクリーンアップをせずにプログラムを素早く終了させます
(関数) [edit]