Назад к вопросам
Junior
117
questionbank

Что делает оператор delete в языке C++?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Оператор delete освобождает память, ранее выделенную оператором new или new[].

Работа оператора delete включает в себя следующее:

  1. Вызов деструктора: Если удаляется объект класса, оператор delete сначала вызывает его деструктор для выполнения необходимых операций очистки или освобождения ресурсов, связанных с объектом. Для POD-типов или встроенных типов деструктор не вызывается.
  2. Освобождение памяти: После вызова деструктора (если применимо), оператор 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;
}