在Win32调试版本中,什么会使VTable指针变为0xdddddddd?

问题描述

| 我正在调试缺陷,并将其范围缩小到对象“ 0”的vtable指针。此答案表明Win32调试版本通常会将死内存或已删除的内存设置为此特殊值。 请注意,指针本身看起来是有效的,只是vtable指针为“ 0”。 这是一段代码:
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
),但是but6ѭ成员无效(
0xdddddddd
)。 一些注意事项: 它是一个单线程应用程序,因此很可能不是竞争条件或互斥问题。 似乎没有任何明显的问题,例如在访问对象之前在调用堆栈中删除该对象。 此问题似乎只能在Windows 2008 Server上再现,而在Windows 7上则无法再现。 关于如何进一步调试的任何建议?

解决方法

释放指针后,您将使用它。从析构函数中的断点获取堆栈跟踪,以查看删除它的原因。或更妙的是,使用shared_ptr <>可以避免此问题。,如果启动程序,请在创建对象的位置放置一个断点。然后添加一个内存断点。如果您覆盖或删除内存,则会触发此事件。好吧,或者以任何方式更改它。 如果不覆盖内存,则您的对象看起来正确,但是您的vtable可能不取决于编译器的具体情况。 如果使用继承,也可能是大小问题。如果您正在使用任何类型的存储桶内存或通过指针以外的任何方式存储对象。,如果pMyObject-> someMethod()最终修改了myObjects列表,它将使任何当前迭代器无效。 此外,如果指针数据已被删除,则将触发相同的问题。,好的,哇,所以我已经用c ++编程了多年了,直到现在才发现这一点……实际上,您可以通过查找魔术数字/魔术调试值来查看调试时原始指针的运行情况! 请参见此处:在Visual Studio C ++中,什么是内存分配表示形式? 此处:https://en.wikipedia.org/wiki/Magic_number_(编程)#Magic_debug_values

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...