Прежде всего, использование delete для чего-либо, выделенного с помощью new[], - это поведение undefined в соответствии со стандартом С++.
В Visual С++ 7 такое спаривание может привести к одному из двух последствий.
Если тип new [] 'ed имеет тривиальный конструктор и деструктор, VС++ просто использует new вместо new[] и использует delete для этого блока отлично работает - new просто вызывает "выделить память", delete просто вызывает "свободную память".
Если тип new [] 'ed имеет нетривиальный конструктор или деструктор, вышеуказанный трюк не может быть выполнен - VС++ 7 должен вызывать точное количество деструкторов. Поэтому он добавляет массив с size_t, хранящим количество элементов. Теперь адрес, возвращаемый new[], указывает на первый элемент, а не на начало блока. Поэтому, если используется delete, он вызывает только деструктор для первого элемента и вызывает "свободную память" с адресом, отличным от адреса, возвращаемого "распределением памяти", и это приводит к некоторому индикатору ошибки внутри HeapFree(), который я подозреваю относится к повреждению кучи.
Однако каждый здесь и там можно читать ложные утверждения, что использование delete после new[] приводит к утечке памяти. Я подозреваю, что любой размер кучевого повреждения гораздо важнее факта, что деструктор вызывается только для первого элемента и, возможно, деструкторы, не вызванные, не освобождают выделенные кучи под-объекты.
Каким образом использование delete после new[] возможно приведет только к утечке памяти в некоторых реализациях С++?