2012-05-05 4 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()에서 반환 된 후 반대 순서로 파괴됩니다.

정적 멤버가 정적으로 할당되고 수명이 프로그램에서 시작되고 끝납니다.

정적 개체가 throw하는 예외를 catch 할 수 없으므로 정적 멤버 초기화에는 예외가 적용되지 않습니다. 프로그램이 시작되기 전에 정적 멤버 초기화 문제가있을 것이라고 "예상해서는 안됩니다."이것은 분명히 오류입니다. 컴파일러와 링커는 정적 정의 문제를 알려줍니다.

+1

클래스 * 템플릿 인스턴스 * (동적 초기화 단계에 속한다고 가정)의 정적 멤버 초기화가 지정되지 않았 음을 언급하는 것이 좋습니다. 또한 여러 번역 단위의 초기화 순서는 항상 지정되지 않습니다. –

관련 문제