Visual c++ 对象的大小因上下文而异 6中,类TangkObjor是在静态库中定义的,C++编译器是VS2008;目标是ARM4(/QRarch4)

Visual c++ 对象的大小因上下文而异 6中,类TangkObjor是在静态库中定义的,C++编译器是VS2008;目标是ARM4(/QRarch4),visual-c++,windows-ce,Visual C++,Windows Ce,类TankObject的实例是通过调用 *TankObject myTankObject=新的TankObject(parm1、parm2…) TankObject定义中声明的最后一个属性是对象指针,当对其进行赋值时,另一个动态分配的对象会发生内存损坏 进入构造函数的步骤显示调用了大小为0x500的运算符new。sizeof(TankObject)根据上下文显示两个不同的值: 在实例化上下文(应用程序)中,sizeof(TankObject)和sizeof(*myTankObject)为0x50

类TankObject的实例是通过调用

*TankObject myTankObject=新的TankObject(parm1、parm2…)

TankObject定义中声明的最后一个属性是对象指针,当对其进行赋值时,另一个动态分配的对象会发生内存损坏

进入构造函数的步骤显示调用了大小为0x500的运算符new。sizeof(TankObject)根据上下文显示两个不同的值:

在实例化上下文(应用程序)中,sizeof(TankObject)和sizeof(*myTankObject)为0x500。 在对象本身(构造函数或对象方法)的上下文中,sizeof(TankObject)和sizeof(*this)是0x508。最后声明的属性的地址是0x500,相对于对象

调用新请求并接收0x500字节。对象本身需要并使用0x508字节,这可能会导致对最后一个属性的分配步进到其他动态分配的对象上

解决方法是在对象定义的末尾声明另一个未使用的属性,以将请求填充到新属性


两个上下文都包含相同的.h文件,为了调试,我将include语句更改为显式路径名。我还检查了编译器开关,使它们完全相同。因此,我感到困惑,如果有人能解释,我很高兴,我想知道一个合适的解决方案。

不知何故,两个项目的编译器设置不同,以至于在文本上相同的定义会生成不同的二进制布局。试着找出第一个(最低地址)不合适的成员(在两个上下文中与对象开头的偏移量不同)。此时问题可能会变得很明显,但如果不是,请将类定义添加到问题中,并指出哪个成员是第一个出现分歧的成员。如果您是
TankObject
具有对齐的成员,则堆分配的成员可能不遵守对齐属性,这就解释了尺寸的不同。目前还不清楚。TankObject拥有属性struct PumpStatus。PumpStatus的成员在上下文之间对齐,但PumpStatus之后声明的属性未对齐4:TankObject作用域将属性提高4个字节,最后声明的属性的访问在分配的内存之外。还值得注意的是,此溢出/未对齐仅在调试配置链接中,在发布配置中,属性都在堆分配的空间内。将_declspec(align(8))添加到第一个属性中,并使用不同的对齐校正大小of和对齐。为什么有必要这样调整还不清楚。