我有一个类,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
第二个移动指令将这个 + 0x218 处的一个字节设置为零,但由于该类只有 0x216 个字节长,这是破坏内存!
回应评论,肯定是markerStart = false 指令。我可以在反汇编视图和内存视图中看到它发生的情况(并使用 Windbg,通过使用数据断点)。下一个类的第一个字节被设置为零,这弄乱了它的 vftbl 指针。
注意:获取 markerStart 的地址并从中减去,得到 0x211!
谁能告诉我从哪里开始寻找解决这个问题的线索?
更新:感谢所有帮助。没有代码,你们中的任何人都几乎不可能解决问题。我正在寻找的是关于从哪里开始寻找的提示。你们中的大多数人都提供了很好的提示,所以谢谢!
我终于找到了问题所在。在这种情况下,对齐已经设置在一个类中,并且在关键代码块之后没有正确重置。对齐错误的类恰好在 C 类声明之前被编译——因此这就是问题出现的地方。