2012-05-05 16 views
1

特定のC++クラスの静的メンバーが作成され、破棄されるのはまさにいつですか? のは、私がWinVersionクラスを定義したとしましょう:静的メンバーが作成され、破棄されるとき?

WinVersion.h

class WinVersion { 
public: 
    // static methods 
    static WinVersion& Get(); 
    static bool Is_NT(); 

    // singleton 
    static WinVersion m_version; 

    // constructor 
    WinVersion(); 

private: 
    unsigned short m_PlatformId; 
    unsigned short m_MajorVersion; 
    unsigned short m_MinorVersion; 
    unsigned short m_BuildNumber; 
}; 

WinVersion.cpp:

// static members 
WinVersion WinVersion::m_version = WinVersion(); // unsure if it's good enough 

// static functions 
WinVersion& WinVersion::Get() { 
    return m_version; 
} 

bool WinVersion::Is_NT() { 
    return (m_version.m_PlatformId == VER_PLATFORM_WIN32_NT); 
} 

// constructor 
WinVersion::WinVersion() 
{ 
    OSVERSIONINFO osinfo; 
    osinfo.dwOSVersionInfoSize = sizeof(OSVERSIONINFO); 
    ... 
} 

m_version静的メンバが作成および破棄されますか?例外の場合はどうなりますか?

+0

あなたのコードがWindows NT上にあると想定するのはかなり安全だと思います。 – Puppy

+0

*いつm_version静的メンバーが作成され、破棄されるのですか?* w.r.tまたは何かと比較してですか?静的メンバーの初期化の順序は、TUで宣言されている順序と同じです。 TUの向こう側に注文は定義されていません。 –

+0

可能な複製:http://stackoverflow.com/q/1421671/777186 – jogojapan

答えて

6

静的メンバーはmain()よりも前に初期化され、main()でのリターン後に作成の逆の順序で破棄されます。

静的メンバーは静的に割り当てられ、その有効期間はプログラムで始まり、プログラムで終了します。

スタティックメンバの初期化には、スタティックオブジェクトがスローする例外をキャッチすることはできないため、例外は適用されません。あなたのプログラムが始まる前に静的メンバーの初期化の問題があると "期待"してはいけません。これは明らかにエラーです。あなたのコンパイラとリンカーは、静的な定義の問題を知らせます。

+1

クラス*テンプレートインスタンス*の静的メンバーの初期化が(動的初期化フェーズにあると仮定して)指定されていないことに言及する価値はあるかもしれません。さらに、複数の翻訳単位にわたる初期化順序は、常に指定されていません。 –

関連する問題