Выбор между delete и delete[] зависит от того, как ты выделил память. Использование неправильного оператора может привести к неопределённому поведению и утечкам памяти.
Когда ты выделяешь один объект с помощью new, ты должен освободить его с помощью delete:
int* ptr = new int;
delete ptr;
Когда ты выделяешь массив объектов с помощью new[], ты должен освободить его с помощью delete[]:
int* arr = new int[10];
delete[] arr;
new вызывает конструктор один раз для одного объектаnew[] выделяет память для нескольких объектов и вызывает конструктор для каждого элементаdelete вызывает деструктор один раз и освобождает памятьdelete[] вызывает деструктор для каждого элемента перед тем как освободить блок памятиИспользование delete для памяти, выделенной под массив, или delete[] для памяти, выделенной под один объект, приводит к неопределённому поведению — это может вызвать повреждение памяти, крэши или утечки памяти.
Чтобы избежать путаницы, используй умные указатели:
std::unique_ptr<int> single(new int);
std::unique_ptr<int[]> array(new int[10]);
Умные указатели автоматически вызывают правильный оператор освобождения памяти, исключая этот частый источник ошибок.
Использование delete для памяти, выделенной с помощью new[], корректно вызовет деструкторы для всех элементов массива перед освобождением блока памяти.
Новый — ещё не проверен сообществом
Вы