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

标签 c++ static

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

  1. Destruction order of static objects are in the reverse order of their construction .

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

  3. 但是,如果在函数中定义了一个静态变量,那么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 成立,这将确保 ab 之前被初始化。并且由于规则 1,可以保证 ba 之前析构。

我的问题是:

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

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

最佳答案

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

在这种情况下,只要你有简单的析构函数,销毁顺序就保证是 B->A。这里有更多 elaborate answer .

关于c++ - 确保c++中静态变量的构造和销毁顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34502880/

相关文章:

performance - 如何 : the minimal server to serve zero length answers

c++ - 从 CPP 代码调用 Objective-C 方法

c - 关于 C 中局部静态变量的不同行为的问题

c++ - g++ 认为我的类声明是 "forward declaration"

c++ - 如果你给一个指针加1,它是真的加1,还是加4或32?

Java 抽象和接口(interface)

java - 静态变量初始化的区别

c++ - C++ 中的静态可变成员变量?

c++ - C++模板模板参数的语法

c++ - 跨应用消息的PostMessage