2009-06-14 20 views
2

カスタマーサイトからクラッシュダンプを受け取りました。私は構造の1つで、nstack __vfptrがNULであることが分かります。__vftptrがNULLです

常に問題のある状態(memeory overrun、オブジェクトを2回削除しています...)を指しているか、このポインタがnullの場合がありますか?

答えて

1

一般的に答えは「はい」ですが、デバッガの不具合も考えてください。

+0

特に、最適化されたコードを実行している場合は真です。 __vfptrが使用されていないために生きていない場合、これが起こっていると確信できます。良好なオプティマイザは、冗長初期化をドロップします。 – MSalters

13

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

は私が前にこの問題を見てきましたし、原因が

 
class C : SomeClassWithVirtualFunctions 
{ 
public: 
    C() 
    { 
    memset(this, 0, sizeof (C)) ; // BAD!! sets _vfptr to 0 too 
    } 
} 

cppcheckようなコードは、オブジェクトが二度(削除されたとき、私はvptr汚職を取得し、きちんとした

0

通常でいたとはい、それはあります常にバグです)。たいていの場合、vptrはランダムなメモリブロックを指しているだけですが、NULLで上書きされているように見えます。これは、OSがリカバリされたメモリを空白にしている可能性があります。上書きする。

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

1

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

5

スタック上に部分的に破壊されたオブジェクトが表示されている場合があります。コンパイラは、仮想関数テーブルのポインタをクリアすることによってオブジェクトの一部を破棄し、 "diamond"継承(共通の仮想基本クラスを持つクラスの多重継承)を持つクラスのデストラクタを正しく実装できるようにすることができます。オブジェクトが破壊されている間に、ダンプ内に部分的に破壊されたオブジェクトが表示されます。

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

+0

それはちょうどintresting、まさに何が起こるかです。ダイヤモンドの継承を持つプログラムは、破壊中にクラッシュします。 – Boris

+0

問題のMSリンクを提供できますか? – Boris

+0

MSがバグを文書化したかどうかはわかりません。あなたはBingの検索を試みることができます! – Nat

関連する問題