确保c++中静态变量的构造和销毁顺序
Ensure the construction and destruction order of static variables in c++
我正在努力寻找一种好的方法来确保静态变量的构造和销毁顺序。据我所知,静态变量是通过以下方式构造和销毁的:
-
静态物体的破坏顺序与构造顺序相反。
-
如果静态变量在不同的文件中定义了全局空间,那么它们的构造顺序就不能得到保证。
-
但是,如果在函数中定义了静态变量,则在第一次执行命中其声明时构造本地静态变量。
基于以上规则,我编写了以下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网站,寻找确保静态变量的构建和销毁顺序的最佳方法,但该部分仍然标记为TODO:WRITE THIS UP。
在您的例子中,您在第一次使用时使用construct,并且您的类的构造函数都不依赖于其他构造函数。因此,保证了初始化顺序A然后B。
在这种情况下,只要你有简单的析构函数,破坏顺序就保证是B->A。这里有一个更详细的答案。
遗憾的是,您目前所做的是"最先进的"。
另一个有用的技术谷歌:
#pragma init_seg(XXX)
-适用于Windows 下的MSVS和英特尔C++
__attribute__ ((init_priority(XXX))
-适用于GCC和clang
此外,我必须警告您,您的本地static
技巧不是线程保存(至少在MSVC、英特尔C++、clang和gcc中是这样),因为它是通过检查和设置全局变量来实现的。
- CMake-按正确顺序将项目与C运行时对象文件链接
- 函数调用中参数的顺序重要吗
- 为什么不;名字在地图上是按顺序排列的吗
- 将Integer转换为4字节的unsined字符矢量(按大端字节顺序)
- 数到第n个楼梯的路(顺序无关紧要)
- 优先顺序:智能指针和类析构函数
- 在循环中按顺序遍历成员变量
- 独立读取-修改-写入顺序
- QML按钮点击功能执行顺序
- C++中数据类型修饰符的顺序
- 当比特(而不是字节)的顺序至关重要时的持久性
- C++从其他 constexpr 创建 lambda 不能按顺序执行 Constexpr
- 通过选项卡的文本设置QTabWidget顺序
- c++11评估顺序(未定义的行为)
- 如何在C++中递归地按相反顺序打印集合
- 给定顺序中的事件处理
- 具有包含其他对象的类的对象创建顺序
- 如何通过替换顺序代码的while循环来添加OpenMP for循环
- 遍历顺序由 std::文件系统directory_iterator给出
- 检查 2 棵树是否具有相同的顺序