如果将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/