c++ - 什么会导致 VTable 指针在 Win32 调试版本中为 0xdddddddd?

标签 c++ debugging vtable

我正在调试一个缺陷,并将其缩小到一个对象的 vtable 指针为 0xddddddddThis answer表示 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 上重现。

关于如何进一步调试它有什么建议吗?

最佳答案

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

关于c++ - 什么会导致 VTable 指针在 Win32 调试版本中为 0xdddddddd?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5713099/

相关文章:

c++ - 如何找到最小第一个索引的 vector<vector<int>> 的所有索引

java - 将android应用程序作为java程序运行来调试

c++ - 虚表指针

c++ - 什么时候为对象设置虚拟表指针(在 C++ 中)?

c++ - 通过按键删除 vector 元素

c++ - 是否设置了最高有效位?

c++ - 在UE4中,为什么要重写BeginPlay,为什么要在重写的BeginPlay中调用Super::BeginPlay?

iphone - iOS 设备调试控制台长度

c++ - 是否可以通过Visual Studio中未处理的异常继续调试?

c++ - 有没有直接的方法可以在编译时获取vtable的地址?