Между чем различие delete
и delete[]
операторы в C++?
Оператор delete
деаллоцирует память и вызывает деструктор для единственного объекта, созданного с помощью new
.
Оператор delete []
деаллоцирует память и вызывает деструкторы для массива объектов, созданных с помощью new []
.
Использование delete
на указателе, возвращаемом new []
или delete []
на указателе, возвращаемом new
приводит к неопределенному поведению.
Оператор 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
применяется к конструкция типа массива), Стандарт ищет оператор new []
в классе типа элемента массива или в глобальной области видимости и передает запрошенный объем памяти. Он может запросить больше, чем N * sizeof (ElementType)
, если захочет (например, чтобы сохранить количество элементов, чтобы позже при удалении он знал, сколько вызовов деструктора нужно выполнить). Если класс объявляет оператор new []
, который дополнительно к объему памяти принимает другой size_t
, этот второй параметр получит количество выделенных элементов - он может использовать это для любых целей. он хочет (отладка и т.д ...).
Для new
, который создает объект, не являющийся массивом, он будет искать оператор new
в классе элемента или в глобальной области видимости. Он передает запрошенный объем памяти (всегда точно sizeof (T)
).
Для delete []
он проверяет тип класса элементов массивов и вызывает их деструкторы.Используемая функция operator delete []
- это функция в классе типа элемента или, если ее нет, то в глобальной области видимости.
Для удаления
, если переданный указатель является базовым классом фактического типа объекта, базовый класс должен иметь виртуальный деструктор (в противном случае поведение не определено). Если это не базовый класс, то вызывается деструктор этого класса и используется оператор delete
в этом классе или глобальный оператор delete
. Если базовый класс был передан, то вызывается деструктор фактического типа объекта и используется оператор delete
, найденный в этом классе, или, если его нет, глобальный оператор delete
называется. Если оператор delete
в классе имеет второй параметр типа size_t
, он получит количество элементов для освобождения.
Операторы delete
и delete []
используются соответственно для уничтожения объектов, созданных с помощью new
и new[]
, возвращаясь к выделенной памяти, оставленной менеджером памяти компилятора.
Объекты, созданные с помощью new
, обязательно должны быть уничтожены с помощью delete
, а массивы, созданные с помощью new[]
, должны быть удалены с помощью delete[]
.