Что произойдет, если вы примените delete[] к указателю, не являющемуся массивом?
Если вы примените "delete" вместо "delete[]" к массиву в C++, то вы создадите утечку памяти, потому что будет удален только первый элемент. Но что произойдет, если вы случайно примените "delete[]" к указателю, не являющемуся массивом? Например (просто игрушечный пример):
class X {
void foo()
{
X* x = new X();
delete[] x; // What happens here?
}
};
Может ли это причинить какой-либо вред? И если да, то какой вред?
2 ответа
Если вы примените "delete" вместо "delete[]" к массиву в C++, то вы создадите утечку памяти, потому что будет удален только первый элемент.
Это не всегда так. Поскольку операторы new, new [], delete, delete [] также могут быть перегружены, использование delete вместо delete[] (или наоборот) может иметь огромное значение.
Кроме того, некоторые компиляторы используют метод перераспределения, описанный здесь. Поэтому применение delete [] к указателю, не являющемуся массивом, приводит к неопределенному поведению.
Если вы используете простой delete
где delete[]
требуется, у вас нет утечки памяти, у вас неопределенное поведение. Во многих случаях вы повредите арену свободного пространства, что приведет к более позднему сбою программы, но, конечно, неопределенное поведение не определено, поэтому может случиться что угодно.
С помощью delete[]
где простой delete
требуется также неопределенное поведение; на практике это тоже часто приводит к повреждению арены в свободном пространстве или другим неприятным последствиям.
Конечно, на практике нет контекста, который я мог бы придумать, где бы вы использовали новый массив, так что вы можете в значительной степени забыть о delete[]
,