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 の前に割り当てを解除できますが、違いは何ですか? メインがすでに完了している場合、両方とも割り当て解除されます。

あなたが助けていただければ幸いです。

4

1 に答える 1

5

ほとんどの場合、反対側で静的初期化の大失敗に見舞われています。基本的に、静的持続時間のオブジェクトの破壊の順序は、同じオブジェクトの作成の逆順です。あなたが持っている場合:

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

構築は最初aにを作成しbmain完了すると を破棄bしますa。で呼び出しの順序を入れ替えると、順序mainが逆になります。この特定の理由から、依存関係で静的期間の変数を扱う場合は注意する必要があります。

于 2011-04-28T16:41:26.197 に答える