【发布时间】:2015-12-29 00:42:49
【问题描述】:
我正在努力寻找一种好的方法来保证静态变量的构造和销毁顺序。据我所知,静态变量的构造和析构方式如下:
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。
【问题讨论】:
-
我有理由确定没有为这种情况定义销毁顺序-唯一的保证是在
main中的代码结束后对象被销毁[仔细选择那里的单词,使确保“在main完全完成之前发生破坏”的情况]。 -
感谢您的快速回复!我可以知道为什么在这种情况下没有定义销毁顺序以及为什么规则 1 不适用于这种情况吗?参考将不胜感激。
-
我只需要吹毛求疵,恕我直言,您应该使用引用而不是指针作为
getStatic函数的返回值。原因很多。 (喜欢更好的可读性,不需要检查nullptr,因为我这么说;-)) -
@Superlokkus:哈哈有道理,但由于我遵循 google 编码风格,所以我只在它是 const 时使用参考。