11

atexit()に登録されている関数が、グローバル変数が破棄される前に呼び出されるのか、破棄される後に呼び出されるのかを知りたいです。これは、定義された標準または実装によって指定されていますか?

4

1 に答える 1

20

それは明確に定義されており、問題のオブジェクトが を使用して関数が登録される前または後に構築されたかどうかによって異なりますatexit()

3.6.3 終了

3.静的ストレージ期間を持つオブジェクトの初期化の完了が への呼び出しの前に順序付けられる場合std::atexit(18.5 を参照<cstdlib>)、に渡された関数へstd::atexitの呼び出しは、オブジェクトのデストラクタへの呼び出しの前に順序付けられます。std::atexit静的ストレージ期間を持つオブジェクトの初期化が完了する前に への呼び出しが順序付けられた場合、オブジェクトのデストラクタへの呼び出しは、 に渡された関数への呼び出しの前に順序付けられますstd::atexit。への呼び出しがstd::atexitへの別の呼び出しの前に配列されている場合std::atexit、2 番目std::atexitの呼び出しに渡された関数への呼び出しは、最初のstd::atexit呼び出しに渡された関数への呼び出しの前に配列されます。

上記の私の素人の解釈は、呼び出される前に構築されたものは呼び出された後atexit(handler)に破棄され、その逆も同様です。微妙なところはあると思いますが、これが基本的な原則のようです。 handler()

于 2012-11-27T14:33:46.693 に答える