gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 23:26:10 24 4
gpt4 key购买 nike

我有一个类,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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com