我正在调试一个缺陷,并将其缩小到对象的 vtable 指针0xdddddddd
。 此答案表明 Win32 调试版本通常会将死内存或已删除的内存设置为此特殊值。
请注意,指针本身看起来是有效的,它只是vtable 指针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 上重现。
关于如何进一步调试的任何建议?