2012-01-10 23 views
1

時々、メンバーの順番を変更するたびに、C++クラスの派生順序を変更すると問題が解決され、クラッシュが修正されるというこの問題が発生しました。メンバーの順序、派生の順序は重要ですか?

最近、私は私のクラスの先頭に下の位置からプライベートメンバ変数の位置を移動するとエラーが

私はクラスA持っていた別の時間固定してしまった:公共のBを、公共C.瞬間Iこれを クラスA:public C、public Bに変更しました。クラッシュするコードが動作し始めました。 Cは仮想メソッド を含むクラスであり、前者の場合、クラスAはCでオーバーライドされたメソッドを見つけられませんでしたが、後でそれを見つけることができました。これは仮想ポインタの破損によるものですか?もしそうなら、それは何のために のメンバーですか?メンバーの順序を変更したときのメモリレイアウトの変更はわかっていますが、VS2008ではクラッシュが発生した理由を確認できなかったため、この種の問題をデバッグするにはどうすればよいですか?

注:基本クラスのBとCは完全に独立しており、互いに

+0

デバッガは、クラッシュについて何かを教えてくれているに違いありません。 –

+4

メンバの順序を変更してクラッシュを修正すると、既存のメモリ破損を単に別の方法でマニフェストすることによってマスクするだけです。 – NPE

+1

これを説明するためのサンプルコードを投稿できますか? – hmjd

答えて

4

ベースクラスとメンバオブジェクトは、宣言の順序で初期化され、ordeでは初期化されませんrを指定します。

ベースのうちの1つが別のベースオブジェクトへのポインタを受け取り、後でそのコンストラクタで使用するためにポインタを格納する以外に何もしない場合、ctorはまだ構築されていないオブジェクトにアクセスします。警告を与えるべきであるMSVC/VS下/W3警告レベルを使用

両方thisがまだ初期化されていないオブジェクトの一部にベースCTORポインティングに渡されたとき、および初期リストが宣言の順序と一致するようにシャッフルされたとき。

+0

基本クラスは互いに完全に独立しています。 – seahorse

1

可能性には依存していません:

  • あなたのヘッダーがの外に出たので、あなたは、すべてソースを再コンパイルしませんでしたが同期;
  • あなたはいくつかある叙事詩未定義行動は、すべてを台無しにしています。デバッグへ

手順:静的解析ツールで

  • 実行
  • 完全な動的解析ツールを使用してデバッガ
  • ファイル名を指定して実行を介してデバッグモードで
  • 実行を再構築
+0

公正であるように、OPがWindows(「VS2008」)下で動作しているように聞こえるので、Valgrindを使うのは難しいかもしれません! –

+0

OK、またはそれに相当するポックスOS OS –

+0

@OliCharlesworth:一方、VSデバッガはかなりいいです。 –

0

配列を定義した可能性があります。int A [M]。 Mはあなたがコードで使用した数より少ないです。 今日もこの問題があります。 定義済み bool mMyArray [6]。

しかし、私のコードでは、どこかでmMyArray [7] = falseを使います。

関連する問題