私は欠陥をデバッグしており、それをオブジェクトの vtable ポインタに絞り込みました0xdddddddd
。 この回答は、Win32 デバッグ ビルドが通常、デッド メモリまたは削除されたメモリをこの特別な値に設定することを示しています。
ポインター自体は有効に見えることに注意してください0xdddddddd
。
コードのスニペットを次に示します。
std::list<IMyObject*>::const_iterator it;
for (it = myObjects.begin(); it != myObjects.end(); ++it)
{
IMyObject* pMyObject = *it;
if (pMyObject == 0)
continue;
pMyObject->someMethod(); // Access violation
}
アクセス違反の行でブレークして を監視すると、それ自体は有効なアドレス ( ) を持っていますが、メンバーは無効 ( )pMyObject
であることがわかります。pMyObject
0x08ede388
__vfptr
0xdddddddd
いくつかのメモ:
- これはシングル スレッド アプリケーションであるため、競合状態やミューテックスの問題ではない可能性が高いです。
- オブジェクトにアクセスする前に、コールスタックのさらに上のオブジェクトを削除するなどの明らかな問題はないようです。
- この問題は、Windows 2008 サーバーでのみ再現可能で、Windows 7 では再現できないようです。
これをさらにデバッグする方法について何か提案はありますか?