繁体   English   中英

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

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

我试图找到一种确保静态变量的构造和破坏顺序的好方法。 据我所知,静态变量是以下列方式构造和破坏的:

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

  2. 如果静态变量在不同文件中定义了全局空间,则无法保证其构造顺序。

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

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

在档案啊

class A {
 public:
  SomeClass* GetStatic() {
    static SomeClass a;
    return &a;
  }
}

在文件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;
  }
}

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

我的问题是:

  1. 我能否知道我所做的事情是否正确或在某些角落案件中可能出错?
  2. 有没有更好或最好的方法来确保静态变量的构造或破坏顺序?

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

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

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

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

谷歌的另一个有用的技术:

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM