我正在努力寻找一种好的方法来保证静态变量的构造和销毁顺序。据我所知,静态变量的构造和销毁方式如下:
Destruction order of static objects are in the reverse order of their construction .
如果静态变量定义在不同文件的全局空间中,那么它们的构造顺序是无法保证的。
但是,如果在函数中定义了一个静态变量,那么local static variable is constructed when the first time execution hits its declaration .
根据上面的规则,我写了下面的c++代码来保证静态变量b
总是在静态变量a
之前被析构,这在我的实验中保证了构造顺序和销毁顺序:
在文件 A.h 中
class A {
public:
SomeClass* GetStatic() {
static SomeClass a;
return &a;
}
}
在文件 B.h 中:
#include "A.h"
class B {
public:
AnotherClass* GetStatic() {
A::GetStatic(); // a dummy call to force the static local variable in
// A::GetStatic() get initialized before the b.
static AnotherClass b;
return &b;
}
}
在上面的示例中,我在 static AnotherClass b;
的声明之前放置了一个虚拟调用 A::GetStatic();
。如果规则 3 成立,这将确保 a
在 b
之前被初始化。并且由于规则 1,可以保证 b
在 a
之前析构。
我的问题是:
- 我能知道我所做的是正确的还是在某些极端情况下可能出错?
- 是否有更好或最好的方法来确保静态变量的构造或销毁顺序?
我还检查了 isocpp.org website以确保静态变量的构造和销毁顺序的最佳方法,但该部分仍标记为 TODO:WRITE THIS UP。
最佳答案
在您的情况下,您在第一次使用时使用构造函数,并且您的类的构造函数都不依赖于另一个。因此初始化的顺序保证了A然后B。
在这种情况下,只要你有简单的析构函数,销毁顺序就保证是 B->A。这里有更多 elaborate answer .
关于c++ - 确保c++中静态变量的构造和销毁顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34502880/