Если выражение new [] используется для создания массива объектов, имеющих деструкторы,
объекты в массиве могут быть неправильно выровнены
#include <stdint.h>
#include <stdio.h>
#pragma pack(8)
struct A{
int64_t i;
char dummy;
~A(){}
};
int main(){
A* pa= new A[2];
printf("sizeof(A)= %d, pointer= %p", sizeof(A), pa);
}
(я строю 32-битную цель с VC ++ 2010 express)
Вывод (на моем компьютере):
sizeof(A)= 16 pointer= 00344f4c
(sizeof (A) = 16 показывает, что компилятор понимает требования выравнивания для A и структура дополняется 7 байтами [отредактировано: __alignof (A) также возвращает 8] )
Я понимаю, почему это происходит: new [] необходимо хранить длину массива, и он использует для этой цели первые 4 байта выделенной памяти, затем он выделяет сам массив без надлежащего заполнения.
С практической точки зрения такое поведение определенно плохое,
но соответствует ли он стандарту или нет?