gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 18:29:03 26 4
gpt4 key购买 nike

我有一个包含静态非原始成员的类。例如:

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com