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文件,其文件名导致订单更改?
第一,
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;到另一个翻译单位,那么所有的赌注都会被取消.订购仅在单个翻译单元中保证.