2012-05-05 30 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实例的静态成员*(假设它落入动态初始化阶段)未指定。此外,跨多个翻译单元的初始化顺序始终未指定。 –