静态变量发布顺序

时间:2011-04-28 16:23:29

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

};

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

问题很奇怪,因为当程序退出时会出现分段错误。当然,默认可以在向量之前解除分配,但有什么区别?当main已经完成时,两者都被解除分配。

非常感谢你的帮助。

1 个答案:

答案 0 :(得分:4)

你最有可能在另一端遇到静态初始化惨败。基本上,静态持续时间对象的破坏顺序与其创建的顺序相反。所以如果你有:

void foo() {
   static type a;
}
void bar() {
   static type b;
}
int main() {
   foo();
   bar();
}

构建将首先创建a,然后bmain完成时,它会销毁b然后a。如果您在main中切换通话顺序,则订单将被反转。出于这个特殊原因,在处理依赖关系的静态持续时间变量时必须要注意。