![](/img/trans.png)
[英]Why is the order of destruction same as order of construction, with static object (C++)?
[英]Ensure the construction and destruction order of static variables in c++
我试图找到一种确保静态变量的构造和破坏顺序的好方法。 据我所知,静态变量是以下列方式构造和破坏的:
如果静态变量在不同文件中定义了全局空间,则无法保证其构造顺序。
但是,如果在函数中定义了静态变量,则在第一次执行命中其声明时构造局部静态变量 。
基于上面的规则,我编写了以下c ++代码,以确保静态变量b
总是在静态变量a
之前被破坏,在我的实验中确保构造顺序和销毁顺序:
在档案啊
class A {
public:
SomeClass* GetStatic() {
static SomeClass a;
return &a;
}
}
在文件Bh中:
#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网站 ,以确保静态变量的构造和销毁顺序的最佳方法,但该部分仍标记为TODO:WRITE THIS UP。
在您的情况下,您在第一次使用时使用构造,并且您的类的构造函数都不依赖于另一个。 因此,初始化的顺序是保证A然后B.
在这种情况下,只要你有简单的析构函数,就可以保证销毁顺序为B-> A. 这是一个更详细的答案 。
可悲的是,你所做的目前是“最先进的”。
谷歌的另一个有用的技术:
#pragma init_seg(XXX)
- 适用于Windows下的MSVS和Intel C ++
__attribute__ ((init_priority(XXX))
- 适用于GCC和clang
另外,我必须警告你,你的本地static
技巧不是线程保存(至少在MSVC,Intel C ++,clang和gcc中),因为它是通过检查和设置全局变量来实现的。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.