Прежде всего, используя delete
для всего, что было выделено с помощью new[]
, это неопределенное поведение в соответствии со стандартом C++.Как спаривание нового [] с удалением может привести только к утечке памяти?
В Visual C++ 7 такое сопряжение может привести к одному из двух последствий.
Если тип нового [] 'е изд имеет тривиальный конструктор и деструктор VC++ просто использует new
вместо new[]
и используя delete
для этого блока работает нормально - new
просто называет „выделить память“, delete
просто называет „свободной памяти“.
Если тип new [] 'ed имеет нетривиальный конструктор или деструктор, вышеуказанный трюк не может быть выполнен - VC++ 7 должен вызывать точное количество деструкторов. Поэтому он добавляет массив с номером size_t
. Теперь адрес, возвращенный new[]
, указывает на первый элемент, а не на начало блока. Поэтому, если используется delete
, он вызывает только деструктор для первого элемента и вызывает «свободную память» с адресом, отличным от адреса, возвращаемого «распределением памяти», и это приводит к некоторому указателю ошибки внутри HeapFree(), который, как я подозреваю, относится к куча коррупции.
Тем не менее, каждый здесь и там можно читать ложные утверждения, что использование delete
после new[]
приводит к утечке памяти. Я подозреваю, что любой размер кучевого повреждения гораздо важнее факта, что деструктор вызывается только для первого элемента, и, возможно, деструкторы, не вызванные, не имеют свободных выделенных кучей под-объектов.
Как можно использовать delete
после new[]
возможно приведет только к утечке памяти на некоторых реализациях на C++?
Для всех ответчиков: вопрос заключается в том, как это может привести к ** только ** утечке памяти, то есть как это возможно ** не ** привести к повреждению кучи. – Thomas
Довольно легко. Все зависит от того, как написано управление памятью. Поскольку это не определено стандартом, все ответы - это просто предположение (но я уверен, что я мог бы написать версию, которая бы не разбивала кучу, а делала утечку памяти). Подсистема управления памятью работает как можно быстрее и эффективнее. Стандарт дал им набор предварительных и пост-условий, при которых подсистема может быть оптимизирована. Разбейте эти условия, и у вас есть неопределенное поведение (возможно, повреждение кучи). В отладочном состоянии стабильность не является целью подсистемы памяти. Следовательно, утечка более вероятна. –
http://stackoverflow.com/questions/1553382/pod-freeing-memory-is-delete-equal-to-delete/1553407#1553407 – sbi