我有一个类,C。C 有一个成员变量声明为:bool markerStart;
从 C 中调用 sizeof(*this) 给出 0x216 字节的值。
在 C 的其他地方,我这样做:markerStart = false;
这个调用并没有将 markerStart 设置为 false,而是破坏了内存中下一个类的开始!
查看反汇编代码,发现:
markerStart = false;
06FB6B7F mov eax, dword ptr [this]
06FB6B78 mov byte ptr [eax+218h], 0
第二条移动指令是将 this + 0x218 处的一个字节设置为零,但由于该类只有 0x216 字节长,这是破坏内存!
回复一个评论,肯定是markerStart = false指令。我可以在反汇编程序 View 和内存 View 中看到它发生(并使用 Windbg,通过使用数据断点)。下一个类的第一个字节被设置为零,这弄乱了它的 vftbl 指针。
注意:取 markerStart 的地址并从中减去它,得到 0x211!
谁能告诉我从哪里开始寻找解决这个问题的线索?
更新:感谢所有的帮助。 没有代码,你们几乎不可能解决这个问题。我正在寻找的是关于从哪里开始寻找的提示。你们中的大多数人都提供了很好的提示,非常感谢!
终于找到问题了。在这种情况下,已经在一个类中设置了对齐,并且没有在关键代码块之后正确重置。对齐错误的类恰好在类 C 的声明之前被编译 - 因此这就是问题出现的地方。
最佳答案
您需要发布更多代码——如果您可以将代码精简到出现异常的最小类定义,那就更好了。这本身可能会帮助您确定正在发生的事情。
我想到的一些可能性:
- 您正在引用另一个 markerStart 变量,它隐藏了您感兴趣的成员变量。
- 您在C 基类的方法中计算sizeof。sizeof() 只测量静态类型,不测量动态类型。
- 你打破了One Definition Rule某处,并且有两个不同版本的 C 类(可能是通过头文件中的一些#ifdef,它在两个翻译单元中的解释不同)。
如果没有更多信息,我会选择 ODR 违规。这些可能是阴险的,并且在编译或链接时无法检测到。
关于c++ - sizeof(*this) 给出了错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/729683/