Страницы

Поиск по вопросам

четверг, 19 декабря 2019 г.

Оператор delete: удаление массива

#массивы #cpp


Здравствуйте. :) 
Вот такой вопрос возник, почему вот этот после выполнения
int *x = new int[2];  delete x;

идентичен вот этому 
int *x = new int[2];  delete []x;

Везде где читал, сказано что массив нужно удалять вторым способом.    


Ответы

Ответ 1



Если вы выделяли память при помощи new[], вы обязаны освободить её с помощью delete[]. Так гласит стандарт. Освобождение такой памяти как-то по-другому (delete без [] или вообще free) является Undefined Behaviour. Если в программе есть Undefined Behaviour, она имеет право вести себя как угодно: может ничего плохого не делать, может вылететь в любой точке, отформатировать ваш винчестер или выбросить из окна вашего кота. You have been warned.

Ответ 2



Если Вы выделили массив элементов, то этот массив и нужно удалить. New делает malloc на sizeof(объект) и вызывает конструктор объекта, new[] делает malloc на sizeof(объект) * кол-во_объектов, вызывает конструкторы для каждого будущего объекта и записывает информацию о том, память для скольких объектов была выделена. Куда и как эта информация записывается вопрос отдельный (плюс бывает ситуации когда это информация не нужна). Вызывая delete Вы говорите компилятору "удали этот один элемент по такому-то адресу". Оператор delete[] же читает сколько объектов расположено в выделенной памяти (как мы помним, оператор new[] сохранил это число в процессе своей работы), вызывает для каждого их них деструктор, а после вызывает free(), "отдавая память назад ОС". Именно поэтому для памяти, выделенной через new/new[] нужно вызывать delete/delete[] соответственно. Контроль за тем, что для оператора выделения должен быть вызван соответствующий оператор освобождения лежит на программисте.

Ответ 3



x - указатель на первый елемент массива, поетому delete x; удаляет только первый елемент.

Ответ 4



Оператор удаления массива называется delete[], а не delete []. В выражении delete []x, []x - это что за операция? []x - нет такой операции !

Комментариев нет:

Отправить комментарий