Утечка памяти при использовании delete для массивов
Зачем существует delete[], если обычный delete не вызывал утечку памяти в этом примере?
void foo() {
int* array = new int[10000000];
delete array;
}
int main() {
foo();
}

Первый снимок при старте программы, второй после результата работы второй строчки кода, третий - при выходе из foo(). Профилирование выполнено в Debug-сборке c помощью VS22, компилятор - clang, схожие результаты с MSVC.
Возможно, это магия, которая при смене компилятора может выстрелить в ногу?
Ответы (2 шт):
Сделайте массив простейших классов, главное, чтоб класс о себе писал при вызове деструктора. Типа
struct Test
{
~Test() { cout << "dtor\n"; }
};
создайте массив
Test * t = new Test[10];
а потом удалите его как detele[] t; и при следующем выполнении - как delete t;. Сравните вывод на экран (если, конечно, он у вас вообще будет, а не будет выброшена надпись о чем-то типа что дамп памяти сброшен...) и решите сами - это достаточный выстрел в ногу или нет?...
Стандарт C++ запрещает вызывать delete (без квадратных скобок) для указателя полученного от new[]. То что прямо сейчас в этом примере вы ничего не сломали – ваше счастье. Но это запрещено, потому что может быть испорчена память в куче, не вызовутся деструкторы объектов и всё что угодно ещё. Неопределённое поведение.
In a single-object delete expression, the value of the operand of delete may be a null pointer value, a pointer value that resulted from a previous non-array new-expression, or a pointer to a base class subobject of an object created by such a new-expression. If not, the behavior is undefined.
In an array delete expression, the value of the operand of delete may be a null pointer value or a pointer value that resulted from a previous array new-expression whose allocation function was not a non-allocating form ([new.delete.placement]).62 If not, the behavior is undefined.
P.S. Почему не сломалось у вас? Потому что в вашем компиляторе delete отличается от delete[] только одним: второй вызывает деструкторы объектов в массиве, а первый нет. Но у int деструктора нет, нет и разницы. Но ещё раз: не надо так делать, это плохо. Следуйте стандарту когда пишете на стандартном языке.