使用全局实例破坏类中的静态成员

Mar*_*ark 7 c++ static destructor member

我有一个带有静态非原始成员的类.例如:

class SomeObject
{
    ... // something that will be destroyed in destructor,
        // like an array pointer.

public:
    SomeObject();
    ~SomeObject(); 
};

class MyClass
{
    static SomeObject m_object;

public:
    MyClass();
    ~MyClass(); // this will access m_object

    static bool SetupStaticMember();
};

/// Implementation of SomeObject and MyClass ///

SomeObject MyClass::m_object;
bool dummy = MyClass::SetupStaticMember(); // Setup the values in m_object, for example,
                                           // allocate memory that will be released in ~SomeObject().

MyClass g_my_global_class;
Run Code Online (Sandbox Code Playgroud)

g_my_global_class被声明为全局变量,因此在离开main()之后调用析构函数.但是,MyClass :: m_object是静态的,所以它也会在main()之后被销毁.

有没有保证~MyClass()会在MyClass :: m_object之前的〜SomeObject()之前执行?换句话说,当调用全局类实例的析构函数时,我可以假设此类的静态成员仍然存在,或者这取决于构造/销毁订单吗?

如果代码按此顺序编写,我认为g_my_global_class是稍后构造的,因此应首先对其进行破坏.如果线路做的事情会改变

MyClass g_my_global_class;
Run Code Online (Sandbox Code Playgroud)

移动到另一个.cpp文件,其文件名导致订单更改?

Nat*_*ica 5

第一,

bool dummy = MyClass::InitStaticMember(); // m_object is initialized here
Run Code Online (Sandbox Code Playgroud)

实际上并不初始化静态成员.这发生在之前的那一行

SomeObject MyClass::m_object;
Run Code Online (Sandbox Code Playgroud)

所以,因为你基本上有

SomeObject MyClass::m_object;
MyClass g_my_global_class;
Run Code Online (Sandbox Code Playgroud)

并且由于对象以相反的顺序g_my_global_class被破坏,然后被销毁MyClass::m_object.

现在,如果你转移MyClass g_my_global_class;到另一个翻译单位,那么所有的赌注都会被取消.订购仅在单个翻译单元中保证.