c++ - 销毁具有全局实例的类中的静态成员

标签 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;

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_classMyClass::m_object 之前被销毁。

现在,如果您将 MyClass g_my_global_class; 移动到不同的翻译单元,那么一切都将失败。仅在单个翻译单元中保证排序。

关于c++ - 销毁具有全局实例的类中的静态成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49112990/

相关文章:

c# - 为什么结构体没有析构函数?

c++ - 根目录 : TTreeReader and TVector3

c++ - if-else语句无法正常工作的怪异错误

c# - 从它自己的类中声明一个静态对象

java - 为什么我收到错误 "non-static variable this cannot be referenced from a static context"?

c++ - 编译器是否应该忽略导致运行构造函数或析构函数的未使用变量?

c++ - OMP中的减少和折叠条款有一些令人困惑的地方

c++ - 为什么我们只能用初始化列表初始化一个数组

java - 为什么我不能以第二种方式使用这个程序

c++ - 放置新的 STL 容器并在之后安全地销毁它