プログラムのコアダンプの1つをデバッグしているときに、多形である含まれているオブジェクトがVPTrを失い、NULLを指していることがわかるシナリオに遭遇しました。
オブジェクトがVPTrを失った場合のシナリオは何でしょうか。
よろしくお願いします、ブリジェッシュ
メモリが破棄されました。つまり、何かがメモリを上書きしました。
delete を呼び出すか、デストラクタを直接呼び出して、それを破棄しました。これは通常、vptr を NULL アウトしません。基本クラスの vtable を指すようになるだけですが、それは実装によって異なります。
ほとんどの場合、ケース 1 です。メモリ ブレークポイントを備えたデバッガがあり、問題を確実に再現できる場合は、vptr にメモリ ブレークポイントを設定し、何が変更されているかを確認します。
何かがオブジェクト全体を上書きした可能性があります。このようなもの:
memset( object, 0, sizeof( *object ) );
vptr を持つオブジェクトで使用されるまでは問題ありません。
オブジェクトのデストラクタ中にvテーブルを使用しようとしている可能性があります。現在、vテーブルは使用できません。