【问题标题】:Why does casting object's address to same class as this points to results in another object value?为什么将对象的地址转换为与 this 指向相同的类会导致另一个对象值?
【发布时间】:2012-04-05 21:18:17
【问题描述】:

我有一个 RTSG::XML3D::OpenGLMeshMA 类的对象。当在其方法 RTSG::XML3D::OpenGLMeshMA::onXflowStateChanged 的​​断点处停止时,我将以下表达式添加到 Watch 窗口中:

如何将对象的原始地址转换为相同的指针类型,因为这会导致不同的对象(object 和 uniqieId 成员在第一行和第二行中具有不同的值)?

系统信息:VS 2008 3.5 SP1,Win 7 64 位。

【问题讨论】:

  • 我猜,虽然我找不到它的文档,但 this 是对该对象的内部引用。而您的第一个是对它的外部引用。这就解释了为什么你只能在一个实例中使用 this,它没有外部引用。
  • @JoshuaDrake 什么是内部参考,它与外部参考有何不同?这些是指针,不是引用,不是吗?
  • 指针是一般意义上的引用。有关 C# 版本,请参阅 this (C#)
  • 我现在明白你的意思了。我很困惑,因为 C++ 也有引用(Foo&)。我想知道为什么一个对象在外部和内部会有不同的指针? vtable 可以在这里关联吗?另请注意,外部指针指的是未初始化的堆内存模式 (0xCDCDCDCD)。也许这暗示了一些事情。
  • 我想知道为什么这个问题谈到 .NET 版本和 64 位,而我们同时关注 C++ 和 32 位指针。

标签: visual-studio-2008 casting watch


【解决方案1】:

唯一合理的解释(调试器错误除外)是您使用了多重继承。对象的开头不是0x0a72d4e4,它在其他地方(可能是更高或更低的指针)。强制转换的行迫使调试器将该地址视为对象的开始,因此它正在读取错误的值。

使用多重继承,'this' 的值可以与对象的起始地址不同,编译器会根据需要插入调整。它在例如讨论here, here.

【讨论】:

  • -1:显示的两个表达式具有相同的类型。多重继承无法解释这一点。没有独立于其类型的“对象的开始”之类的东西,因为任何对象都可以是派生对象(在继承方面)的子对象(在布局方面)。
  • 当然,最上面的对象显示的类型与第二行的对象相同。这是 C 风格的演员表。
  • 当然可以。而多重继承只能在type不同的情况下解释同一个指针的不同解释。假设“this”实际上是一个指向派生对象的 OpenGLMeshMA 子对象的指针,该派生对象非虚拟地从多个 OpenGLMeshMA 继承,这看起来很荒谬。即使这样,这两个(相同的)指针也不可能指向对象内不同的 OpenGLMeshMA 实例。这个 IDE 肯定发生了其他事情。
  • 我不知道当时发生了什么,但一定是某种调试器错误。
猜你喜欢
  • 1970-01-01
  • 2023-03-07
  • 1970-01-01
  • 2013-09-18
  • 1970-01-01
  • 2020-04-14
  • 1970-01-01
  • 1970-01-01
  • 2013-08-16
相关资源
最近更新 更多