удалите по сравнению с, удаляют [] операторы в C++

Между чем различие delete и delete[] операторы в C++?

115
задан Scooter 23 December 2014 в 15:19
поделиться

3 ответа

Оператор delete деаллоцирует память и вызывает деструктор для единственного объекта, созданного с помощью new.

Оператор delete [] деаллоцирует память и вызывает деструкторы для массива объектов, созданных с помощью new [].

Использование delete на указателе, возвращаемом new [] или delete [] на указателе, возвращаемом new приводит к неопределенному поведению.

131
ответ дан 24 November 2019 в 02:24
поделиться

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

80
ответ дан 24 November 2019 в 02:24
поделиться

Операторы delete и delete [] используются соответственно для уничтожения объектов, созданных с помощью new и new[], возвращаясь к выделенной памяти, оставленной менеджером памяти компилятора.

Объекты, созданные с помощью new, обязательно должны быть уничтожены с помощью delete, а массивы, созданные с помощью new[], должны быть удалены с помощью delete[].

4
ответ дан 24 November 2019 в 02:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: