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