4

お客様のサイトからクラッシュ ダンプを受け取りました。nstack __vfptr の構造体の 1 つで NUL になっていることがわかります。

問題のある状態 (メモリ オーバーラン、オブジェクトの 2 回の削除など) を常に指していますか、それともこのポインターが null になる可能性がある場合があります。

4

5 に答える 5

15

クラスのインスタンスのどこかでmemset()を使用していますか?

私は以前にこの問題を見たことがあり、原因は次のようなコードでした

クラスC:SomeClassWithVirtualFunctions
{{
公衆:
  C()
  {{
    memset(this、0、sizeof(C)); // 悪い!!_vfptrも0に設定します
  }
}

cppcheckはきちんとしている

于 2009-06-14T13:31:54.947 に答える
6

スタック上に部分的に破壊されたオブジェクトが表示されている可能性があります。コンパイラは、仮想関数テーブルポインタをクリアすることでオブジェクトの一部を破棄済みとしてマークし、プログラムがクラッシュした場合に「ダイヤモンド」継承(共通の仮想基本クラスを持つクラスの多重継承)を持つクラスのデストラクタを正しく実装できるようにします。オブジェクトの破棄中に、ダンプ内に部分的に破棄されたオブジェクトが表示されます。

古いMSVCコンパイラは、ダイヤモンド継承を持つクラスのデストラクタを正しく実装していませんでした。1つを破壊しようとすると、プログラムがクラッシュします。これがまだ当てはまるかどうかはわかりません。

于 2009-06-14T16:16:29.387 に答える
1

一般的に答えは「はい」ですが、それもデバッガーの不具合である可能性があることを考慮する必要があると思います。

于 2009-06-14T13:30:01.567 に答える
1

typeidこれは、仮想関数を持たないクラスのオブジェクトで実行時の型情報を取得しようとした場合 (つまり、関数を使用した場合) に発生する可能性があります。

于 2009-06-14T14:48:58.803 に答える
0

通常、オブジェクトが2回削除されると、vptrが破損します(もちろん、これは常にバグです)。ほとんどの場合、vptrはメモリのランダムなブロックを指しているだけですが、NULLによって上書きされているようです。これは、OSが再利用されたメモリを空白にしている可能性があります。または、何をしているのかを示している可能性があります。上書き。

boost :: shared_ptrを使用して、所有権のある存続期間を維持することを検討してください。

于 2009-06-14T14:37:37.160 に答える