delete (C++) (delete (C++))

Перейти к навигации Перейти к поиску

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

Операция управление памятью

[править | править код]

В языке программирования C++ оператор delete возвращает память, выделенную оператором new, обратно в кучу. Вызов delete должен происходить для каждого вызова new, чтобы избежать утечки памяти. После вызова delete объект, указывающий на этот участок памяти, становится некорректным и не должен больше использоваться. Многие программисты присваивают 0 (нуль-указатель) указателям после использования delete, чтобы минимизировать количество ошибок программирования. Удаление нуль-указателя фактически не имеет эффекта, так что нет необходимости проверять указатель на равенство 0 перед вызовом delete (такая проверка входит в алгоритм оператора delete).

Фрагмент кода в качестве примера:

int *p_var = nullptr;  // объявление нового указателя
p_var = new int;       // память динамически выделяется
 
/* .......
остальной код
........*/

delete p_var;          // память освобождается
p_var = nullptr;       // указатель заменяется на нуль-указатель

Массивы, созданные (выделенные) при помощи new [], аналогичным образом могут быть уничтожены (освобождены) при помощи delete []:

int size = 10;
int *p_var = nullptr;  // объявление нового указателя
p_var = new int [size];// память динамически выделяется

/* .......
остальной код
........*/

delete [] p_var;       // память освобождается
p_var = nullptr;       // указатель заменяется на нуль-указатель

Вызов delete[] для массива объектов приведет к вызову деструктора для каждого объекта перед освобождением памяти, выделенной под массив.

С развитием языка C++ и стандартизацией технологии RAII в современных программных продуктах использование ручного выделения памяти с помощью операций new и delete не рекомендуется[2].

Спецификатор доступа

[править | править код]

В стандарте языка C++11 контекст использования ключевого слова delete расширился и оно стало применяться не только как операция в связке с операцией new, но и как спецификатор наряду с ключевым словом default. В этой роли функцией спецификатора delete стало явное ограничение доступа к специальным методам классов (конструкторам, деструкторам, конструкторам перемещения, операторам присваивания и т. п.) Спецификатор default аналогичным образом позволяет указать тот метод класса, который компилятору предписывается использовать по умолчанию[1].

Примечания

[править | править код]
  1. 1 2 Olsson, 2018, Special Member Functions, p. 77.
  2. Horton, Van Weert, 2018, p. 609.