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