C++/Ключевые слова/delete

Материал из Энциклопедия о программировании
Перейти к: навигация, поиск

delete (удалить) в языке программирования C++ — ключевое слово для освобождения памяти, аналог free в Си.

Данное ключевое слово было изначально введено в стандарт для осуществления освобождения памяти, выделенной оператором new. Т.е. delete удаляет объекты, созданные при помощи new.

В модернизированном стандарте C++11 ключевому слову delete была также отведена роль спецификатора доступа к специальным функциям-членам классов, который запрещает их использование.

После освобождения памяти с помощью оператора delete, в указателе всё ещё остаётся адрес на освобождённую область памяти. Необходимо присваивание указателю нулевого указателя после освобождения памяти, на которую он ссылался. Операция delete в C++ (free в Си) безопасна для нулевого указателя. Например:

Bar *foo = new Bar();
delete foo; // foo != NULL
delete foo; // Ошибка! память уже недоступна

в то время как в таком варианте ошибки не будет:

Bar *foo = new Bar();
delete foo; // foo != NULL
foo = NULL; // foo == NULL
delete foo; // ошибки нет

Синтаксис

  • При использовании оператора ключевого слова delete для указателя, символ операции разыменования (знак *) не используется.
  • Для массивов используется синтаксис с одними квадратными кавычками ([]) вне зависимости от измерений, т.е. массивы могут быть сколь угодно мерными.

Классификация

delete является ключевым словом, а не оператором, как его ошибочно могут назвать (aka оператор удаления/освобождения/очистки памяти, удалятель и пр. вар-ты).

Примеры

delete b;

Удаление простого объекта (не массива), на который ссылается указатель b, из памяти. Освобождение памяти по адресу b. При этом переменная указателя b никуда не девается, и её можно использовать вновь для новых данных.

delete[] b;

Очистка памяти занимаемой массивом, на который ссылался указатель b. Удаление динамического массива из памяти. Если для массива использовать delete b, то будет удалена память только первого элемента, поэтому для массивов delete надо использовать именно так.