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作成および破棄されますか? 例外の場合はどうなりますか?

4

1 に答える 1

7

静的メンバーは main() の前に初期化され、main() で返された後、作成と逆の順序で破棄されます。

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

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

于 2012-05-05T17:03:01.777 に答える