c++ - sizeof(*this) 给出了错误的值

标签 c++ assembly sizeof

我有一个类,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 的声明之前被编译 - 因此这就是问题出现的地方。

最佳答案

您需要发布更多代码——如果您可以将代码精简到出现异常的最小类定义,那就更好了。这本身可能会帮助您确定正在发生的事情。

我想到的一些可能性:

  1. 您正在引用另一个 markerStart 变量,它隐藏了您感兴趣的成员变量。
  2. 您在C 基类的方法中计算sizeof。sizeof() 只测量静态类型,不测量动态类型。
  3. 你打破了One Definition Rule某处,并且有两个不同版本的 C 类(可能是通过头文件中的一些#ifdef,它在两个翻译单元中的解释不同)。

如果没有更多信息,我会选择 ODR 违规。这些可能是阴险的,并且在编译或链接时无法检测到。

关于c++ - sizeof(*this) 给出了错误的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/729683/

相关文章:

c - sizeof-operator 反向行为

debugging - ollydbg 操作码跟踪

c++ - 使用 SCons 跨平台构建 Boost

c++ - 在 C++ 中处理相互依赖类的最佳方法是什么?

c++ - 如何使用递归缩进行?

程序集 32 位保护模式,标签未指向定义的字符串?

macos - 在Mac 0SX上使用x86汇编程序的Hello World

c - 菜鸟关于malloc和sizeof的问题

计算多维数组第一维

C++ 静态唯一方法?