delete vs delete [] операторы в C++

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

7 ответов


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

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

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


на delete[] оператор используется для удаления массивов. The 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, этот второй параметр получит количество выделенных элементов-it может использовать это для любых целей, которые он хочет (отладка и т. д...).

на new что создает объект без массива, он будет искать operator new в классе элемента или в глобальной области видимости. Он передает объем запрошенной памяти (точно sizeof(T) всегда).

на delete[], он просматривает тип класса элементов массивов и вызывает их деструкторы. The operator delete[] используемая функция находится в классе типа элемента, или если его нет, то в глобальной области.

на delete, Если переданный указатель базового класса из типа фактического объекта, то базовый класс должен иметь виртуальный деструктор (в противном случае поведение не определено). Если это не базовый класс, то вызывается деструктор этого класса и operator delete в этом классе или глобальной есть. Если базовый класс был передан, то вызывается деструктор фактического типа объекта и operator delete найденный в этом классе используется, или если его нет, глобальный operator delete называется. Если the operator delete в классе есть второй параметр типа size_t, он получит количество элементов для освобождения.


Это основное использование шаблона выделения / Выделения в c++ malloc / free, new / delete, new [] / delete[]

мы должны использовать их соответственно. Но я хотел бы добавить это конкретное понимание разницы между Delete и delete[]

1) удалить используется для де-выделения памяти, выделенной для один объект

2) удалить[] используется для де-выделения памяти, выделенной для массив объектов

класс ABC{}

ABC *ptr = новый ABC[100]

когда мы говорим новый[100].. компилятор может получить информацию о том, сколько объектов необходимо выделить(здесь это 100) и вызовет конструктор для каждого из созданных объектов

но, соответственно, если мы просто использовать удалить ptr в этом случае компилятор не будет знать, сколько объектов ptr указывает на и в конечном итоге вызов деструктора и удаление памяти только для 1 объекта(оставляя вызов деструкторов и освобождение оставшихся 99 объектов). Следовательно, будет утечка памяти

поэтому нам нужно использовать удалить [] ptr в этом случае.


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

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


когда я задал этот вопрос, мой вопрос был, "есть ли разница между двумя? Разве среда выполнения не должна хранить информацию о размере массива, и поэтому она не сможет сказать, какой из них мы имеем в виду?"Этот вопрос не появляется в "связанных вопросах", поэтому, чтобы помочь таким, как я, вот ответ на это: " зачем нам вообще нужен оператор delete []?"


delete используется для одного указателя и delete[] используется для удаления массива с помощью указателя. этой может помочь вам лучше понять.


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

test* a = new test[100];
delete a;

и уже проверенный этот код не имеет утечки memeory.