В чем разница между операторами delete и delete[] в С++?
Delete vs delete [] в С++
Ответ 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[].
Ответ 5
delete используется для одного указателя, а delete[] используется для удаления массива с помощью указателя.
Это может помочь вам лучше понять.