1

请帮忙,

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

我有一个抽象类 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 类型的静态变量。

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

您的帮助将不胜感激。

4

1 回答 1

5

您很可能在相反的一端遇到了静态初始化惨败。基本上,静态持续时间的对象的销毁顺序是创建相同对象的相反顺序。因此,如果您有:

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

构造将首先创建a,然后b,当完成时main,它将销毁。如果您切换调用的顺序,那么顺序将被颠倒。由于这个特殊原因,在处理依赖项的静态持续时间变量时,您必须注意。bamain

于 2011-04-28T16:41:26.197 回答