确保c++中静态变量的构造和销毁顺序

Ensure the construction and destruction order of static variables in c++

本文关键字:顺序 c++ 静态 变量 确保      更新时间:2023-10-16

我正在努力寻找一种好的方法来确保静态变量的构造和销毁顺序。据我所知,静态变量是通过以下方式构造和销毁的:

  1. 静态物体的破坏顺序与构造顺序相反。

  2. 如果静态变量在不同的文件中定义了全局空间,那么它们的构造顺序就不能得到保证。

  3. 但是,如果在函数中定义了静态变量,则在第一次执行命中其声明时构造本地静态变量。

基于以上规则,我编写了以下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成立,则确保ab之前初始化。并且由于规则1,可以保证ba之前被破坏。

我的问题是:

  1. 我能知道我所做的是正确的还是在某些情况下可能出错吗
  2. 是否有更好或最好的方法来确保静态变量的构建或销毁顺序

我还查看了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中是这样),因为它是通过检查和设置全局变量来实现的。