Черт, я пропустил весь смысл вопроса, но Я оставлю свой первоначальный ответ в качестве опоры. Почему мы удалили [], потому что давным-давно мы удалили [cnt], даже сегодня, если вы пишете delete [9] или delete [cnt], компилятор просто игнорирует вещь между [], но компилирует ok. В то время C++ сначала обрабатывался интерфейсом, а затем загружался в обычный компилятор C. Они не могли сделать трюк хранения графа где-то под занавеской, возможно, они не могли даже думать об этом в то время.И для обратной совместимости компиляторы, скорее всего, использовали значение, заданное между [], как количество массивов, если нет такого значения, тогда они получили счетчик из префикса, поэтому он работал в обоих направлениях. Позже мы ничего не набрали между [], и все сработало. Сегодня я не думаю, что «delete []» необходимо, но реализации требуют этого.
Мой первоначальный ответ (что не попадает в точку) ::
«Удалить» удаляет один объект. «delete []» удаляет массив объектов. Для удаления [] для работы реализация сохраняет количество элементов в массиве. Я просто проверил это путем отладки кода ASM. В тестируемой версии (VS2005) счетчик был сохранен как префикс массива объектов.
Если вы используете «delete []» на одном объекте, переменная count является мусором, поэтому код выходит из строя. Если вы используете «delete» для массива объектов, из-за некоторой несогласованности код выходит из строя. Я тестировал эти случаи только сейчас!
«delete просто удаляет память, выделенную для массива». заявление в другом ответе неверно. Если объект является классом, delete будет вызывать DTOR. Просто поместите точку останова в DTOR-код и удалите объект, точка останова ударит.
Что случилось с тем, что если библиотеки компилятора & предполагают, что все объекты, выделенные «новыми», являются объектными массивами, было бы нормально вызвать «удалить» для отдельных объектов или массивов объектов. Одиночные объекты только бы частный случай массива объекта, имеющего счетчик 1. Может быть, есть что-то мне не хватает, так или иначе ...
Actualy, когда u использует новый int [1], он хранится на голове массива до того, как он будет первым, размером с него. Таким образом, использование delete вместо delete [] не освободит эту часть памяти. – Rodrigo 2009-04-24 13:35:03