Подтвердить что ты не робот

Delete vs delete [] в С++

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

4b9b3361

Ответ 1

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

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

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

Ответ 2

Оператор 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;

Для a new, который создает массив (так что либо new type[] или new применяется к конструкции типа массива), Стандарт ищет operator new[] в классе типа элемента массива или в глобальном scope и передает объем запрошенной памяти. Он может запросить больше, чем N * sizeof(ElementType), если он хочет (например, для хранения количества элементов, поэтому позже, когда удаление знает, сколько вызовов деструкторов сделано). Если класс объявляет operator new[], что дополнительный объем памяти принимает другой size_t, второй параметр получит количество выделенных элементов - он может использовать это для любой цели, которую он хочет (отладка и т.д.).

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

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

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

Ответ 3

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

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

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

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

класс ABC {}

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

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

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

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

Ответ 4

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

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