桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

配列

d:id:youandi:20080418#p3
こんな感じのプログラムで、Class2のメンバ変数m_aClass2のデストラクタでプログラムが異常終了するBUGに遭遇。

class Class1 {
public:
  Class1() : m_bValid( false ) {}
public:
  bool& Valid() { return m_bValid; }
private:
  bool m_bValid;
};

class Class2 {
public:
  Class2() {}
public:
  void Exec() {
    for ( int i = 0; i < = 5; ++i ) {  // 回しすぎ
      m_aClass1[ i ].Valid() = true;
    }
    for ( int j = 0; j < 5; ++j ) {
      m_aClass2[ j ].Valid() = true;
    }
  }
private:
  Class1 m_aClass1[ 5 ];
  Class1 m_aClass2[ 5 ];
};

int main()
{
  Class2 cls;
  cls.Exec();
}

何だ?と思って、Class1クラスを一生懸命デバッグしたのですが原因不明。とりあえず、m_aClass1/m_aClass2をヒープで確保するようにしたら異常終了しなくなった。Stackメモリが足りなかったのが原因?と思っていたら、今度はClass2クラスのExec関数で異常終了するようになった。
結局の所、m_aClass1の処理で配列の上限を超えてループ回していて且つ、Setter系のメソッドを呼び出してメモリをぶっ壊していたのが原因でm_aClass2の挙動がおかしくなっていた。この手のBUGは何度か経験しているけどぱっと見では気が付かなかったりするんだよな。今回もApplication Verifier Toolのおかげで潰せました。