В чем разница между delete
и delete[]
операторы в C ++?
c++
memory-management
delete-operator
shreyasva
источник
источник
vector<>
вместо массива, когда это возможно.std::unique_ptr<int>(new int[3])
, потому что он будет вызывать регулярныйdelete
массив для неопределенного поведения. Вместо этого вам нужно использоватьstd::unique_ptr<int[]>
Ответы:
delete
Оператор освобождает память и вызывает деструктор для одного объекта , созданного сnew
.delete []
Оператор освобождает память и вызовы деструкторов для массива объектов , созданных сnew []
.Использование
delete
указателя, возвращаемого указателем,new []
илиdelete []
указателя, возвращаемого объектом,new
приводит к неопределенному поведению.источник
delete[]
Оператор используется для удаления массивов.delete
Оператор используется для удаления объектов без массивов. Он вызываетoperator delete[]
иoperator delete
выполняет функцию соответственно для удаления памяти, которую занял массив или объект, не являющийся массивом, после (в конечном итоге) вызова деструкторов для элементов массива или объекта, не являющегося массивом.Ниже показаны отношения:
Для того ,
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
, он получит количество элементов, которые нужно освободить.источник
Это базовое использование шаблона allocate / DE-allocate в c ++
malloc
/free
,new
/delete
,new[]
/delete[]
И мы должны использовать их соответственно. Но я хотел бы добавить это конкретное понимание разницы между
delete
иdelete[]
1)
delete
используется для освобождения памяти, выделенной для одного объекта2)
delete[]
используется для освобождения памяти, выделенной для массива объектовкогда мы говорим
new ABC[100]
, компилятор может получить информацию о том, сколько объектов нужно выделить (здесь 100), и вызовет конструктор для каждого из созданных объектовно соответственно, если мы просто используем
delete ptr
для этого случая, компилятор не будет знать, на сколько объектовptr
указывает, и в конечном итоге вызовет деструктор и удалит память только для 1 объекта (оставив вызов деструкторов и освобождение оставшихся 99 объектов). Следовательно, будет утечка памяти.поэтому нам нужно использовать
delete [] ptr
в этом случае.источник
free()
то и это. Если вы используете шаблон псевдодеструктора, вы должны вызывать его один раз для каждого объекта, используяfor
цикл.Операторы
delete
иdelete []
используются соответственно для уничтожения объектов, созданных с помощьюnew
иnew[]
, с возвратом в выделенную память, оставшуюся доступной для диспетчера памяти компилятора.Объекты, созданные с помощью,
new
обязательно должны быть уничтожены с помощьюdelete
, а массивы, созданные с помощью,new[]
должны быть удалены с помощьюdelete[]
.источник
Когда я задал этот вопрос, мой реальный вопрос был: «Есть ли разница между ними? Разве среда выполнения не должна хранить информацию о размере массива, и поэтому она не сможет определить, какой из них мы имеем в виду?» Этот вопрос не встречается в «связанных вопросах», поэтому, чтобы помочь таким, как я, вот ответ на него: «зачем нам вообще нужен оператор delete []?»
источник
delete
используется для одного единственного указателя иdelete[]
используется для удаления массива с помощью указателя. Это может помочь вам лучше понять.источник
Ну .. может я думаю, это просто для явного. Оператор
delete
и операторdelete[]
различаются, ноdelete
оператор также может освободить массив.И уже проверенный этот код не имеет утечки памяти.
источник