В чем разница между new
/ delete
и malloc
/ free
?
Связанный (дубликат?): В каких случаях я использую malloc против new?
c++
memory-management
MrDatabase
источник
источник
Ответы:
новый / удаление
таНос / бесплатно
Таблица сравнения функций:
Технически память, выделенная new, поступает из Free Store, а память, выделенная malloc, из Heap. Являются ли эти две области одинаковыми - это детали реализации, что является еще одной причиной того, что malloc и new нельзя смешивать.
источник
If ptr is NULL, no operation is performed.
new
Оператор выделяет память из свободного хранилища (также известное как динамическая память»). и куча. ) Стандарт C ++ 14, раздел 3.7.4 « Динамическое хранилище» гласит: «Объекты могут создаваться динамически во время выполнения программы (1.9) с использованием выражений new (5.3.4) и уничтожаться с помощью выражений удаления.»Наиболее существенным отличием является то, что
new
оператор выделяет память, затем вызывает конструктор иdelete
вызывает деструктор, а затем освобождает память.источник
new
вызывает ctor объекта,delete
вызывает dtor.malloc
&free
просто выделить и освободить сырую память.источник
new
/delete
это C ++,malloc
/free
происходит от старого доброго C.В C ++
new
вызывает конструктор объектов иdelete
вызывает деструктор.malloc
иfree
, начиная с темных веков до ОО, только выделяет и освобождает память, не выполняя никакого кода объекта.источник
В C ++
new
/delete
вызовите Constructor / Destructor соответственно.malloc
/free
просто выделить память из кучи.new
/delete
выделить память также.источник
Единственное сходство состоит в том, что
malloc
/new
оба возвращают указатель, который обращается к некоторой памяти в куче, и они оба гарантируют, что, как только такой блок памяти будет возвращен, он не будет возвращен снова, если вы сначала не освободите / удалите его. То есть они оба «выделяют» память.Тем не менее,
new
/delete
выполнять произвольную другую работу, кроме того, через конструкторы, деструкторы и перегрузку операторов.malloc
/free
только когда-нибудь выделяю и освобождаю память.Фактически,
new
он достаточно настраиваем, чтобы не обязательно возвращать память из кучи или даже выделять память вообще. Однако по умолчаниюnew
.источник
Основное различие между new и malloc заключается в том, что new вызывает конструктор объекта, а соответствующий вызов delete вызывает деструктор объекта.
Есть и другие отличия:
new
безопасенmalloc
от типа , возвращает объекты типаvoid*
new
выдает исключение при ошибке,malloc
возвращаетNULL
и устанавливает errnonew
является оператором и может быть перегружен,malloc
является функцией и не может быть перегруженnew[]
, который распределяет массивы, является более интуитивным и безопасным для типов, чемmalloc
malloc
-извлеченные выделения могут быть изменены с помощьюrealloc
,new
-извлеченные распределения не могут быть измененыmalloc
может выделять N-байтовый кусок памяти,new
нужно попросить выделить массив, скажем,char
типовСмотря на различия, резюме - это malloc на C-esque, а новое на C ++ - esque. Используйте тот, который кажется правильным для вашей базы кода.
Хотя законно, что new и malloc реализуются с использованием разных алгоритмов выделения памяти, в большинстве систем new внутренне реализуется с использованием malloc, не приводя к разнице на уровне системы.
источник
Есть несколько вещей, которые
new
этогоmalloc
не делают:new
создает объект, вызывая конструктор этого объектаnew
не требует типизации выделенной памяти.Так что, если вы используете
malloc
, то вам нужно явно делать вышеперечисленные вещи, что не всегда практично. Кроме того,new
может быть перегружен, ноmalloc
не может быть.Одним словом, если вы используете C ++, старайтесь использовать
new
как можно больше.источник
также,
глобальные new и delete могут быть переопределены, malloc / free - нет.
в дальнейшем более новые и удаляемые могут быть переопределены для каждого типа.
источник
new
иdelete
являются примитивами C ++, которые объявляют новый экземпляр класса или удаляют его (таким образом вызывая деструктор класса для экземпляра).malloc
иfree
являются функциями C, и они выделяют и освобождают блоки памяти (по размеру).Оба используют кучу, чтобы сделать распределение.
malloc
иfree
тем не менее являются более «низкоуровневыми», поскольку они просто резервируют кусок памяти, который, вероятно, будет связан с указателем. Вокруг этой памяти не создаются никакие структуры (если только вы не считаете массив C структурой).источник
new и delete являются операторами в c ++; которые тоже могут быть перегружены. malloc и free являются функциями в c;
malloc возвращает ноль ptr, когда происходит сбой, а new создает исключение.
Адрес, возвращаемый функцией malloc, должен быть снова приведен к типу, так как он возвращает (void *) malloc (size). Новый возвращает типизированный указатель.
источник
источник
malloc()
, нам нужно включить<stdlib.h>
или<alloc.h>
в программу, которая не требуется дляnew
.new
иdelete
может быть перегружен, ноmalloc
не может.new
, мы можем передать адрес, где мы хотим выделить память, но это невозможно в случаеmalloc
.источник
alloc.h
не является стандартным заголовком.<new>
Требуется использовать размещение нового.Этот код для использования ключевого слова удаления или свободной функции. Но при создании объекта указателя с помощью 'malloc' или 'new' и освобождении памяти объекта с помощью delete даже этот указатель объекта может быть функцией вызова в классе. После этого используйте free вместо delete, тогда он также работает после оператора free, но при использовании обоих, только объект-указатель не может вызвать функцию в классе ... код выглядит следующим образом:
источник
1. новый синтаксис проще, чем malloc ()
2.new/delete - оператор, в котором malloc () / free () - это функция.
3.new/delete выполняется быстрее, чем malloc () / free (), потому что новый ассемблерный код напрямую вставляется компилятором.
4. мы можем изменить / удалить новое значение в программе с помощью оператора overlading.
источник