【问题标题】:When static members are created and destroyed?什么时候创建和销毁静态成员?
【发布时间】:2012-05-05 16:45:40
【问题描述】:

特定 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 静态成员何时创建和销毁?出现异常怎么办?

【问题讨论】:

  • 我认为假设您的代码在 Windows NT 上是相当安全的。
  • 什么时候创建和销毁 m_version 静态成员? w.r.t 或与什么比较?静态成员的初始化顺序与在 TU 中声明的顺序相同。整个 TU 的顺序没有定义。

标签: c++


【解决方案1】:

静态成员在main()之前初始化,在main()中返回后按创建的相反顺序销毁。

静态成员是静态分配的,它们的生命周期以程序开始和结束。

异常不适用于静态成员初始化,因为您无法捕获静态对象将抛出的任何异常。在您的程序开始之前,您不应该“期望”存在静态成员初始化问题,这显然是一个错误。您的编译器和链接器会通知您静态定义的任何问题。

【讨论】:

  • 可能值得一提的是,类模板实例的静态成员的初始化(假设它属于动态初始化阶段)是未指定的。此外,跨多个翻译单元的初始化顺序始终未指定。
猜你喜欢
  • 1970-01-01
  • 2012-09-11
  • 2023-03-31
  • 2011-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
相关资源
最近更新 更多