我正在调试一个问题,并将其缩小到对象的虚函数表指针为 0xdddddddd
。 这个答案表明Win32 debug builds通常会将已被删除或未使用的内存设置为这个特殊值。
注意,指针本身看起来是有效的,只是虚函数表指针是 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上无法重现。
IMyObject
的析构函数中设置断点并查看是否有人删除了对象。 - Naveen