2012-05-05 27 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

可能值得一提的是,初始化類* template實例的靜態成員*(假設它落入動態初始化階段)未指定。此外,跨多個翻譯單元的初始化順序始終未指定。 –