-1

プログラムで不可解なエラーやクラッシュが発生します。デバッグを進めて見回すと、変数を NULL に設定していることに気付きましたが、直後にブレークポイントを設定する0xcdcdcd00と、NULL に設定しただけなのに変数が に設定されます。

プログラムで何らかのメモリ破損が発生しているようです。

メモリ破損の原因を特定するための優れた手法は何ですか? これが発生する前に大量のコードを追加したので、コードを調べているときに、メモリの破損を引き起こす可能性のあるものを探す必要がありますか?

というクラスmonsterから派生した というクラスがありますmob

次のコードを実行します。

monster* newMon = new monster();

モンスタークラスのコンストラクターを呼び出します:

monster::monster() : mob() {
    this->renderer = NULL;
}

この関数の最後でブレークすると、renderer =0xcdcdcd00または時々0xcdcdcdcd

4

4 に答える 4

1

gimpel lint(この種のものをたくさん検出する)などの優れた静的コードチェッカーを入手し、valgrind(無料)またはpurifyまたはその他のランタイムチェッカーを使用する必要があります。

ただし、場所をゼロに設定し、その直後にデバッガーがゼロではないと表示する場合は、最適化がオフになっていることを確認することをお勧めします。わずかに最適化されたコードでさえ、デバッガーをほとんど役に立たないものに混乱させる可能性があります。

発生する別の質問は、このコードはマルチスレッドですか、それとも検査しているメモリは別のプロセスと共有されていますか?この場合、競合他社の危険を検出するためにコードを注意深く調べる必要があると思いますが、そのための優れたツールはわかりません。

于 2012-08-30T08:29:19.990 に答える
1

問題が見つかりました..

mobクラスを2つの異なるファイルで定義しました。どうやってそれを見落としたのかわからない。

于 2012-08-30T09:07:06.573 に答える
1

これ

monster::monster() : mob() {
    this->renderer = NULL;
}

rendererNULL に設定します。私はそれをに変更します

monster::monster() : mob(), renderer(NULL) {
}

しかし、それは違いを生むべきではありません(読みやすさ以外)。

問題は次の 2 つのいずれかです。

  • 古いビルド
  • 最適化して実行し、デバッガーで値を確認します (これは私の推測です)。NULL ではないことがわかるかもしれませんrendererが、リリース ビルドでデバッガーを信頼するべきではありません。

いくつかのデバッグ ステートメントを出力すると、値が実際に正しく設定されていることがわかります。

monster::monster() : mob(), renderer(NULL) {
   if (renderer)
       std::cout << "WTH!";
   else
       std::cout << "correctly set to NULL";
}
于 2012-08-30T08:35:07.360 に答える
0

0xcdcdcdcd多くの場合、メモリが初期化されていないことを示しています。これrendererは、 が基本クラスにある場合にも発生する可能性があります。in classに名前を変更rendererしてみて、同じ問題が発生するかどうかを確認してください。m_renderermonster

于 2012-08-30T08:36:25.567 に答える