← Назад ко всем вопросам

Что такое delete[]

1️⃣ Как кратко ответить

delete[] — это оператор в C++, используемый для освобождения памяти, выделенной для массивов объектов с помощью оператора new[]. Он гарантирует вызов деструкторов для всех элементов массива и освобождение всей выделенной памяти.

2️⃣ Подробное объяснение темы

В C++ управление памятью является важной задачей, особенно когда речь идет о динамическом выделении памяти. Для этого используются операторы new и delete. Когда мы работаем с массивами, выделенными динамически, необходимо использовать специальные версии этих операторов: new[] и delete[].

Зачем нужен delete[]

Когда вы выделяете память для массива объектов с помощью new[], вы создаете блок памяти, который может содержать несколько объектов. Каждый из этих объектов может иметь свой деструктор, который должен быть вызван при освобождении памяти. Оператор delete[] гарантирует, что деструкторы всех объектов в массиве будут вызваны, и вся выделенная память будет корректно освобождена.

Как работает delete[]

Рассмотрим пример, чтобы понять, как работает delete[]:

#include <iostream>
​
class MyClass {
public:
    MyClass() {
        std::cout << "Constructor called" << std::endl;
    }
    ~MyClass() {
        std::cout << "Destructor called" << std::endl;
    }
};
​
int main() {
    // Выделяем память для массива из 3 объектов MyClass
    MyClass* myArray = new MyClass[3];
​
    // Освобождаем память, вызывая delete[]
    delete[] myArray;
​
    return 0;
}

Объяснение кода:

  1. Класс MyClass:

    • Содержит конструктор, который выводит сообщение при создании объекта.
    • Содержит деструктор, который выводит сообщение при уничтожении объекта.
  2. Выделение памяти:

    • MyClass* myArray = new MyClass[3]; — выделяет память для массива из трех объектов MyClass. Конструктор MyClass вызывается трижды, по одному разу для каждого элемента массива.
  3. Освобождение памяти:

    • delete[] myArray; — освобождает память, выделенную для массива. Деструктор MyClass вызывается трижды, по одному разу для каждого элемента массива, обеспечивая корректное завершение работы каждого объекта.

Важные моменты

  • Использование delete вместо delete[] для массивов, выделенных с помощью new[], приведет к неопределенному поведению, так как деструкторы могут не быть вызваны для всех элементов массива.
  • delete[] должен использоваться только для памяти, выделенной с помощью new[]. Использование его для памяти, выделенной с помощью new, также приведет к неопределенному поведению.
  • Правильное управление памятью критически важно для предотвращения утечек памяти и других ошибок, связанных с памятью.

Таким образом, delete[] является важным инструментом для управления динамической памятью в C++, обеспечивая корректное освобождение памяти и вызов деструкторов для всех элементов массива.

Тема: Память / new-delete / Lifetime
Стадия: Tech

🔒 Подпишись на бусти автора и стань Алигатором, чтобы получить полный доступ к функционалу сайта и отслеживать свой прогресс!

Твои заметки