我正在寻找一种确保静态变量的构造和销毁顺序的好方法。据我所知,静态变量的构造和销毁方式如下:
在文件A.h中:
在B.h文件中:
在上面的例子中,我在声明
我的问题是:
如果在不同文件的全局空间中定义静态变量,则它们的构造顺序不能保证。
但是,如果一个静态变量在函数中定义,则第一次执行命中其声明时会构造局部静态变量。
在文件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
之前被销毁。我的问题是:
- 我能否知道我所做的是否正确,或者在某些边角情况下可能出错?
- 是否有更好或最佳的方法来确保静态变量的构造或销毁顺序?
getStatic
函数中使用引用而不是指针作为返回值。原因有很多(比如更好的可读性,无需检查nullptr
,因为我这么说了;-))。 - Superlokkus