web-dev-qa-db-ja.com

C ++は、グローバルおよびクラスの静的変数のデストラクタを呼び出しますか?

私のサンプルプログラムからは、両方のケースでデストラクタを呼び出すようです。グローバル変数とクラス静的変数のデストラクタは、プログラムスタックのデータセクションに割り当てる必要があるため、どの時点で呼び出されますか?

49
user236215

C++ 03標準の3.6.3から:

静的ストレージ期間の初期化されたオブジェクト(ブロックスコープまたは名前空間スコープで宣言された)のデストラクタ(12.4)は、mainから戻った結果として、およびexit(18.3)を呼び出した結果として呼び出されます。これらのオブジェクトは、コンストラクターの完了または動的初期化の完了と逆の順序で破棄されます。オブジェクトが静的に初期化されると、オブジェクトは動的に初期化された場合と同じ順序で破棄されます。配列またはクラスタイプのオブジェクトの場合、サブオブジェクトの構築中に初期化された静的ストレージ期間を持つローカルオブジェクトが破棄される前に、そのオブジェクトのすべてのサブオブジェクトが破棄されます。

さらに、§9.4.2 7の状態:

静的データメンバは、非ローカルオブジェクトとまったく同じように初期化および破棄されます(3.6.2、3.6.3)。

ただし、デストラクタに監視可能な動作がない場合、デストラクタを呼び出すことはできません。 Terry Mahaffeyがこれについて詳しく説明しています 「C++デストラクタは、ブロックの最後まで呼び出されないことが保証されていますか?」

62
outis

「メイン」の後のどこか

(呼び出される正確な順序を知ることも、信頼することもできません)

2
Vi.