确保c ++

时间:2015-12-29 00:42:49

标签: 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

  4. 根据上述规则,我编写了以下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;
      }
    }
    

    在上面的示例中,我在声明A::GetStatic();之前放了一个虚拟调用static AnotherClass b;。如果规则3成立,则可确保在a之前初始化b。由于规则1,可以保证在b之前a被破坏。

    我的问题是:

    1. 我能否知道我所做的事情是否正确或在某些角落案件中可能出错?
    2. 是否有更好或最好的方法来确保静态变量的构造或破坏顺序?
    3. 我还检查了isocpp.org website以确保静态变量的构造和破坏顺序的最佳方法,但该部分仍标记为TODO:WRITE THIS UP。

2 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

可悲的是,你所做的事情目前是“最先进的”。

google的另一项有用技巧:

#pragma init_seg(XXX) - 适用于Windows下的MSVS和英特尔C ++

__attribute__ ((init_priority(XXX)) - 适用于GCC和clang

另外,我必须警告你,你的本地static技巧不是线程保存(至少在MSVC,Intel C ++,clang和gcc中),因为它是通过检查和设置全局变量来实现的。