Прежде всего, использование 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[]
возможно приведет только к утечке памяти в некоторых реализациях С++?