我试图找到一种确保静态变量的构造和破坏顺序的好方法。据我所知,静态变量是以下列方式构造和破坏的:
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
之前被破坏,在我的实验中确保构造顺序和销毁顺序:
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;
}
}
在上面的示例中,我在声明A::GetStatic();
之前放了一个虚拟调用static AnotherClass b;
。如果规则3成立,则可确保在a
之前初始化b
。由于规则1,可以保证在b
之前a
被破坏。
我的问题是:
我还检查了isocpp.org website以确保静态变量的构造和破坏顺序的最佳方法,但该部分仍标记为TODO:WRITE THIS UP。
答案 0 :(得分:3)
在你的情况下,你在第一次使用时使用了构造,并且你的类的构造函数都不依赖于另一个。因此,初始化的顺序是保证A然后B。
在这种情况下,只要你有简单的析构函数,就可以保证销毁顺序为B-> A.这是一个更elaborate answer。
答案 1 :(得分:0)
可悲的是,你所做的事情目前是“最先进的”。
google的另一项有用技巧:
#pragma init_seg(XXX)
- 适用于Windows下的MSVS和英特尔C ++
__attribute__ ((init_priority(XXX))
- 适用于GCC和clang
另外,我必须警告你,你的本地static
技巧不是线程保存(至少在MSVC,Intel C ++,clang和gcc中),因为它是通过检查和设置全局变量来实现的。