4

クラスのプライベートセクションで列挙型が定義されています。このタイプのメンバーも定義されています。コンストラクター本体でこのメンバーを初期化しようとすると、実行時にメモリ破損の問題が発生します。代わりに、同じコンストラクターの初期化リストを使用して初期化すると、メモリ破損の問題は発生しません。私は何か間違ったことをしていますか?

コードを単純化し、それがGCCのバグである場合は、結合/継承などの特定のクラスの組み合わせであると確信していますが、これが問題の本質を捉えていることを約束します。初期化される前にこのメンバー変数を使用するものはなく、完全に構築されるまで、新しく作成されたオブジェクトを使用するものはありません。このメンバーの初期化は確かに私が本体で最初に行うことであり、メモリの破損が発生すると、valgrindはそれが変数を初期化する行にあると言います。Valgrindは、サイズ4の無効な書き込みであると述べています。

関連するヘッダーコード:


private:  
  enum StateOption{original = 0, blindside};    
  StateOption currentState;

関連する.cppコード(メモリの破損とクラッシュを引き起こします):


MyClass::MyClass(AClass* classPtr) : 
  BaseClass(std::string("some_setting"),classPtr)
{
  currentState = original;
  ...
}

関連する.cppコード(メモリの破損やクラッシュを引き起こしません):


MyClass::MyClass(AClass* classPtr) : 
  BaseClass(std::string("some_setting"),classPtr),
  currentState(original)
{
  ...
}
  

編集:これを引き起こした原因については、私の「答え」を参照してください。それを読んだ後、なぜそれが違いを生んだのか誰かが私に説明できますか?ヘッダーの何も変更しませんでした。オブジェクトファイルを挿入したときに印刷ステートメントが表示され、一方のビルドではバグが表示されなかったため、オブジェクトファイルが再構築されていました。

良い説明のために、私はそれをこの質問への答えとしてマークします。

4

1 に答える 1

1

後世のために:

何らかの理由で、make スクリプトがこれらのファイルへの変更を取得していないように見えます。メイクファイルで「クリーン」ターゲットを許可するのではなく、オブジェクトを手動で削除すると、完全な再構築が行われ (時間がかかりました)、問題は解消されました。

于 2010-10-22T14:21:16.853 に答える