Насколько серьезной является ошибка несоответствия оператора new/delete?

Я обнаружил классическую ошибку несоответствия new/delete в нашей базе кода следующим образом:

char *foo = new char[10];

// do something

delete foo; // instead of delete[] foo;

Насколько серьезно это? Это вызывает утечку памяти или ошибку? Каковы последствия. У нас есть проблемы с памятью, но это не кажется достаточно серьезным, чтобы объяснить все наши симптомы (куча коррупции и т.д.).

EDIT: дополнительные вопросы для ясности
Он просто освобождает первый член массива? или
Из-за этого система теряет контроль над массивом? или
Коррумпированная память - это какой-то способ?

Ответ 1

Это undefined поведение серьезное (он может работать, он может упасть, он может сделать что-то еще).

Ответ 2

На первый взгляд вызов delete вместо delete[] не должен быть очень плохим: вы уничтожаете первый объект и вызываете утечку памяти.

НО: затем delete (или delete[]) вызывает free, чтобы освободить память. И free нуждается в изначально выделенном адресе, чтобы освободить память правильно. Или дело в том, что new возвращает исходный адрес, выделенный malloc, new[] возвращает другой адрес.

Вызов бесплатного адреса, возвращаемого new[], вызывает сбой (он освобождает память хаотично).

Смотрите эти очень поучительные ссылки для лучшего понимания:

http://blogs.msdn.com/b/oldnewthing/archive/2004/02/03/66660.aspx#66782

http://web.archive.org/web/20080703153358/http://taossa.com/index.php/2007/01/03/attacking-delete-and-delete-in-c

Из этих статей также очевидно, почему вызов delete[] вместо удаления также очень плохая идея.

Итак, чтобы ответить: да, это очень серьезная ошибка. Он повреждает память (после вызова деструктора только первого объекта).