delete vs delete [] операторы в C ++ - PullRequest
103 голосов
/ 11 марта 2010

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

Ответы [ 7 ]

122 голосов
/ 11 марта 2010

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

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

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

80 голосов
/ 11 марта 2010

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

12 голосов
/ 25 июня 2014

Это основное использование шаблона allocate / DE-allocate в c ++ malloc / free, new / delete, new [] / delete []

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

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

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

класс ABC {}

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

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

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

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

4 голосов
/ 11 марта 2010

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

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

1 голос
/ 31 января 2018

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

0 голосов
/ 02 февраля 2018

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

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

И уже проверил этот код, нет утечки памяти.

0 голосов
/ 26 ноября 2014

delete используется для одного указателя, а delete[] используется для удаления массива через указатель. Это может помочь вам лучше понять.

...