如果将new []表达式用于创建具有析构函数的对象数组,
数组中的对象可能未正确分配

#include
#include

#pragma pack(8)
结构A {
int64_t i;
字符假人
〜A(){}
};

int main(){
A * pa =新的A [2];
printf(“sizeof(A)=%d,指针=%p”,sizeof(A),pa);
}

(我使用VC++ 2010 Express构建32位目标)

(在我的计算机上)输出为:

sizeof(A)= 16指针= 00344f4c

(sizeof(A)= 16表明编译器无法理解A的对齐要求,并且该结构用7个字节填充[编辑:__alignof(A)也返回8])

我知道为什么会发生这种情况:new []需要存储数组长度,并且为此目的使用前4个字节的已分配内存,然后它在没有适当填充的情况下分配了数组本身。

从实际的角度来看,这种行为肯定很差,
但是是否符合标准?

最佳答案

为此,您应该使用__declspec。您的代码也在我的计算机上生成了未对齐的对象(使用VS2010),但是当我更改为__declspec(align(8))时,指针已正确对齐。

我相信pragma pack仅会更改该结构的大小,并且不能对其位置进行任何保证。

关于c++ - new []表达式不支持Microsoft VC++中的对齐方式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4827674/

10-11 02:37