Ответ 1
Это undefined поведение серьезное (он может работать, он может упасть, он может сделать что-то еще).
Я обнаружил классическую ошибку несоответствия new/delete в нашей базе кода следующим образом:
char *foo = new char[10];
// do something
delete foo; // instead of delete[] foo;
Насколько серьезно это? Это вызывает утечку памяти или ошибку? Каковы последствия. У нас есть проблемы с памятью, но это не кажется достаточно серьезным, чтобы объяснить все наши симптомы (куча коррупции и т.д.).
EDIT: дополнительные вопросы для ясности
Он просто освобождает первый член массива? или
Из-за этого система теряет контроль над массивом? или
Коррумпированная память - это какой-то способ?
Это undefined поведение серьезное (он может работать, он может упасть, он может сделать что-то еще).
На первый взгляд вызов delete
вместо delete[]
не должен быть очень плохим: вы уничтожаете первый объект и вызываете утечку памяти.
НО: затем delete
(или delete[]
) вызывает free
, чтобы освободить память. И free
нуждается в изначально выделенном адресе, чтобы освободить память правильно. Или дело в том, что new
возвращает исходный адрес, выделенный malloc, new[]
возвращает другой адрес.
Вызов бесплатного адреса, возвращаемого new[]
, вызывает сбой (он освобождает память хаотично).
Смотрите эти очень поучительные ссылки для лучшего понимания:
http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660.aspx#66782
Из этих статей также очевидно, почему вызов delete[]
вместо удаления также очень плохая идея.
Итак, чтобы ответить: да, это очень серьезная ошибка. Он повреждает память (после вызова деструктора только первого объекта).