delete[]
Оператор використовується для видалення масивів. delete
Оператор використовується для видалення об'єктів без масивів. Він викликає operator delete[]
і operator delete
функціонує відповідно, щоб видалити пам'ять, яку об'єкт масиву або не масив займав після (зрештою) виклику деструкторів для елементів масиву або об'єкта, що не є масивом.
Далі показано відносини:
typedef int array_type[1];
// create and destroy a int[1]
array_type *a = new array_type;
delete [] a;
// create and destroy an int
int *b = new int;
delete b;
// create and destroy an int[1]
int *c = new int[1];
delete[] c;
// create and destroy an int[1][2]
int (*d)[2] = new int[1][2];
delete [] d;
Для того, new
що створює масив (таким чином, new type[]
або new
застосовується до конструкції типу масиву), Стандарт шукає operator new[]
клас типу елемента масиву або в глобальній області і передає потрібний обсяг пам'яті. Він може вимагати більше, ніж N * sizeof(ElementType)
якщо хоче (наприклад, зберігати кількість елементів, тому пізніше при видаленні знає, скільки викликів деструктора виконано). Якщо клас оголошує, operator new[]
що додатковий об'єм пам'яті приймає інший size_t
, цей другий параметр отримає кількість виділених елементів - він може використовувати це для будь-яких цілей, які він захоче (налагодження тощо).
Для того, new
що створює об'єкт без масиву, він буде шукати operator new
в класі елемента або в глобальному масштабі. Він передає потрібний обсяг пам'яті (точно sizeof(T)
завжди).
Для цього delete[]
, він вивчає тип класу елементів масиву та викликає їх деструктори. Використовувана operator delete[]
функція - це в класі типу елемента, або якщо такої немає, то в глобальній області застосування.
Для delete
, якщо переданий покажчик є базовим класом типу фактичного об'єкта, базовий клас повинен мати віртуальний деструктор (інакше поведінка не визначена). Якщо це не базовий клас, то викликається деструктор цього класу і використовується ін operator delete
в цьому класі або глобальному operator delete
. Якщо базовий клас був переданий, то викликається деструктор фактичного типу об'єкта, і використовується operator delete
знайдений у цьому класі, або якщо його немає, operator delete
називається глобальним . Якщо operator delete
у класі є другий параметр типу size_t
, він отримає кількість елементів, які потрібно розмістити.