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

kee*_*lar 5 c++ static

我试图找到一种确保静态变量的构造和销毁顺序的好方法。据我所知,静态变量的构造和销毁方式如下:

  1. 静态对象的销毁顺序与其构造顺序相反

  2. 如果静态变量在不同的文件中被定义为全局空间,那么它们的构造顺序是无法保证的。

  3. 但是,如果在函数中定义了静态变量,则在第一次执行达到其声明时构造局部静态变量

基于上面的规则,我写了下面的c++代码来确保静态变量b总是在静态变量之前被破坏a,在我的实验中保证了构造顺序和破坏顺序:

在档案啊

class A {
 public:
  SomeClass* GetStatic() {
    static SomeClass a;
    return &a;
  }
}
Run Code Online (Sandbox Code Playgroud)

在文件 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,我A::GetStatic();static AnotherClass b;. 如果规则 3 成立,这确保a在 之前初始化b。并且由于规则 1,可以保证b在 之前被破坏a

我的问题是:

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

我还查看了isocpp.org 网站以了解确保静态变量的构造和销毁顺序的最佳方法,但该部分仍标记为 TODO: WRITE THIS UP。

g24*_*24l 4

在您的情况下,您在第一次使用时使用构造函数,并且您的类的构造函数都不依赖于另一个。这样初始化的顺序就保证了 A 然后 B。

在这种情况下,只要有简单的析构函数,销毁顺序就保证是 B->A。这是一个更详细的答案


归档时间:

查看次数:

1678 次

最近记录:

10 年,1 月 前