静态变量释放顺序

Dmi*_*kov 1 c++ static-members static-functions

请帮忙,

问题:以下代码中的核心转储:

我有一个抽象类 SomeOtherClass,并从它派生了 SomeOtherClassImpl。

这是导致问题的代码:

class MyClass
{

public:

  void someFunction()
  {
    myVector().push_back(someOtherClassDefault());
  }

private:

  static std::vector<SomeOtherClass const *> & myVector()
  {
    static std::vector<SomeOtherClass const *> theVector;
    return theVector;
  }

  static SomeOtherClass const * someOtherClassDefault()
  {
    static SomeOtherClassImpl theDefault;
    return &theDefault;
  }

};
Run Code Online (Sandbox Code Playgroud)

我在其他翻译单元中有一些 MyClass 类型的静态变量。

这个问题很奇怪,因为程序退出时会发生分段错误。当然 theDefault 可以在 theVector 之前被释放,但是有什么区别呢?当 main 已经完成时,两者都被解除分配。

您的帮助将不胜感激。

Dav*_*eas 5

您很可能遇到了静态初始化失败,就在另一端。基本上,静态持续时间对象的销毁顺序与创建的顺序相反。所以如果你有:

void foo() {
   static type a;
}
void bar() {
   static type b;
}
int main() {
   foo();
   bar();
}
Run Code Online (Sandbox Code Playgroud)

建设将首先创建a,然后b,当main完成时,它会破坏ba。如果您切换 中的调用main顺序,则顺序将被颠倒。由于这个特殊原因,您在处理依赖项上的静态持续时间变量时必须注意。