Назад к вопросам
Junior
117
questionbank
Что делает оператор delete в языке C++?
Sobes Copilot
Получайте ответы в реальном времени
Ответ от нейросети
sobes.tech AI
Оператор delete освобождает память, ранее выделенную оператором new или new[].
Работа оператора delete включает в себя следующее:
- Вызов деструктора: Если удаляется объект класса, оператор
deleteсначала вызывает его деструктор для выполнения необходимых операций очистки или освобождения ресурсов, связанных с объектом. Для POD-типов или встроенных типов деструктор не вызывается. - Освобождение памяти: После вызова деструктора (если применимо), оператор
deleteвозвращает память обратно в пул свободной памяти (обычно через вызов специфичной для платформы функции, например,freeдляmalloc).
Синтаксис:
// Для одного объекта
delete pointer_to_object;
// Для массива объектов
delete[] pointer_to_array;
Важно помнить:
- Вызов
deleteдля указателя, не указывающего на память, выделеннуюnewилиnew[], или для уже освобожденной памяти приводит к неопределенному поведению. - Использование
deleteиdelete[]должно соответствовать способу выделения памяти (new->delete,new[]->delete[]). Несоответствие также приводит к неопределенному поведению. - После вызова
deleteуказатель становится "висячим" (dangling pointer) и должен быть присвоенnullptr, чтобы избежать случайного использования.
Пример:
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "Constructor called" << std::endl; }
~MyClass() { std::cout << "Destructor called" << std::endl; }
};
int main() {
// Выделение памяти для одного объекта
MyClass* obj_ptr = new MyClass;
// Освобождение памяти для одного объекта
delete obj_ptr;
obj_ptr = nullptr; // Присваиваем nullptr для избежания висячего указателя
std::cout << "--- Before array deletion ---" << std::endl;
// Выделение памяти для массива объектов
MyClass* arr_ptr = new MyClass[3];
// Освобождение памяти для массива объектов
delete[] arr_ptr;
arr_ptr = nullptr; // Присваиваем nullptr
return 0;
}