我有一个包含静态非原始成员的类。例如:
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;
g_my_global_class 被声明为全局变量,所以它的析构函数在离开 main() 后被调用。 然而,MyClass::m_object 是静态的,所以它也会在 main() 之后被销毁。
是否可以保证 ~MyClass() 会在 MyClass::m_object 的 ~SomeObject() 之前执行?换句话说,当全局类实例的析构函数被调用时,我是否可以假设该类的静态成员仍然存在以供访问,还是取决于构造/析构顺序?
如果按照这个顺序写代码,我觉得g_my_global_class是后构造的,应该先析构。如果行做事情改变
MyClass g_my_global_class;
移动到另一个 .cpp 文件并且它的文件名导致顺序改变?
最佳答案
首先,
bool dummy = MyClass::InitStaticMember(); // m_object is initialized here
实际上并不初始化静态成员。这发生在之前的行
SomeObject MyClass::m_object;
所以既然你基本上有
SomeObject MyClass::m_object;
MyClass g_my_global_class;
并且由于对象以相反的顺序销毁,因此 g_my_global_class
在 MyClass::m_object
之前被销毁。
现在,如果您将 MyClass g_my_global_class;
移动到不同的翻译单元,那么一切都将失败。仅在单个翻译单元中保证排序。
关于c++ - 销毁具有全局实例的类中的静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49112990/