Оператор 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
, он получит количество элементов, которые необходимо освободить.