2

これは私を完全に神秘的にしています。クラス宣言には、次の2行があります。

std::multimap<int, int> commands;
std::multimap<std::string, std::string> config;

コードは問題なくコンパイルされますが、実行すると次のエラーが発生します。

*** glibc detected *** ./antares: free(): invalid pointer: 0xb5ac1b64 ***

2つの変数が後でどのように処理されるかとは関係がないことを除けば、十分に単純なようです。コードの残りの部分で変数へのすべての参照を削除しましたが、それでもクラッシュしました。行の1つ(どちらか1つ)をコメントアウトしましたが、プログラムは問題なく実行されました。どちらの特定の変数でもエラーが発生しないのはなぜですか?私はSTLにバグがないことを前提に作業していますが、コードがこれをどのように実行できるかについてのアイデアが不足しています。

これは私を困惑させたので、あなたが提供できるどんな助けにも感謝します。ワイアット

編集:私はSTLに問題があることを示唆していません、それは私が少し気難しいだけでした。私はバグが私のコードにあることを知っています、私が知りたいのは-参照されていない変数を宣言するとそれがクラッシュする可能性があるのは何が間違っている可能性がありますか?なぜそれが私のコードに影響を与えるのでしょうか?

私のコードは数千行の長さなので、誰かがそれを読む価値はありません。私は正しい方向に私を向けてくれる人を探しています。

4

2 に答える 2

7

問題が GCC または STL にないことを前提としているのは正しいことです。ただし、マップがfreeエラーを引き起こしている場合は、他のコードがスタック破壊 (またはヒープ破壊) を起こしている可能性があります。追跡するのは本当に恐ろしいバグです。スタック破壊の悪い点は、壊れたオブジェクトがバグのあるオブジェクトではないことです。

デバッグのヒントを次に示します。

  • valgrindの下でアプリを実行します。
  • _GLIBCXX_DEBUGstl デバッグを有効にするように定義する
  • MALLOC_CHECK_=1環境変数として追加します。これにより、より適切な malloc エラー メッセージが得られます。詳細はこちら
  • まれに、破壊される場所にメモリウォッチを追加できました. しかし、スマッシングがどこで発生するかを予測できる場合はまれです。
于 2010-07-13T15:57:07.770 に答える
2

おっしゃる通り、クラッシュはこれら 2 行によるものではなく、表示されるだけです。

この問題を診断する方法は次のとおりです。

  • まず、変数を定義したままにします (プログラムをクラッシュさせます)

  • 次に、クラッシュが発生しなくなるまで、コードの他の部分を削除または無効にします。次に、メモリを破損するおおよその領域を知ることができます。

  • 3番目(無効にするとクラッシュを停止する領域ができたら)、クラッシュが再び発生するまで、その部分の有効化を開始します。

編集:あなたの問題は、2つのマルチマップを含むコードにあると思います(コピーコンストラクターまたは代入演算子が欠落しているか、そのようなものです)。勝手な推測ですのであまり当てにしないでください。

于 2010-07-13T15:51:06.170 に答える