在Win32调试版本中,什么可以导致VTable指针为0xdddddddd?

Leo*_*Hat 10 c++ debugging vtable

我正在调试一个缺陷,并将其缩小到对象的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     
}
Run Code Online (Sandbox Code Playgroud)

如果我在访问冲突的行中断并观察pMyObject,我可以看到它pMyObject本身有一个有效的地址(0x08ede388)但该__vfptr成员是无效的(0xdddddddd).

一些说明:

  • 它是一个单线程应用程序,因此很可能不是竞争条件或互斥问题.
  • 似乎没有任何明显的问题,比如在访问对象之前将对象进一步向上删除.
  • 此问题似乎只能在Windows 2008服务器上重现,但不能在Windows 7上重现.

有关如何进一步调试的任何建议?

jan*_*anm 10

它在释放后使用指针.从析构函数中的断点获取堆栈跟踪以查看删除它的内容.或者更好的是,使用shared_ptr <>来避免问题.

  • 您正在寻找删除对象而不从列表中删除指针的情况,或者可以将对象多次插入列表但仅在删除时从列表中删除的情况. (2认同)