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 2 Olsson, 2018, Special Member Functions, p. 77.
- ↑ Horton, Van Weert, 2018, p. 609.
Источники
[править | править код]- I. Horton, P. Van Weert. Beginning C++17: From Novice to Professional. — Fifth Edition. — Apress, 2018. — ISBN 978-1-4842-3366-5. — doi:10.1007/978-1-4842-3366-5.
- M. Olsson. C++17 Quick Syntax Reference: A Pocket Guide to the Language, APIs and Library. — Third Edition. — Apress, 2018. — ISBN 978-1-4842-3599-7. — doi:10.1007/978-1-4842-3600-0.