Если выражение 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 байта выделенной памяти, а затем выделяет сам массив без надлежащего заполнения.
С практической точки зрения такое поведение определенно плохое, но соответствует ли он стандарту или нет?