В чем разница между new/ deleteи malloc/ free?
Связанный (дубликат?): В каких случаях я использую malloc против new?
В чем разница между new/ deleteи malloc/ free?
Связанный (дубликат?): В каких случаях я использую malloc против new?
Ответы:
Таблица сравнения функций:
Feature | new/delete | malloc/free
--------------------------+--------------------------------+-------------------------------
Memory allocated from | 'Free Store' | 'Heap'
Returns | Fully typed pointer | void*
On failure | Throws (never returns NULL) | Returns NULL
Required size | Calculated by compiler | Must be specified in bytes
Handling arrays | Has an explicit version | Requires manual calculations
Reallocating | Not handled intuitively | Simple (no copy constructor)
Call of reverse | Implementation defined | No
Low memory cases | Can add a new memory allocator | Not handled by user code
Overridable | Yes | No
Use of (con-)/destructor | Yes | No
Технически память, выделенная 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и устанавливает errno
newявляется оператором и может быть перегружен, 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являются примитивами 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, но при использовании обоих, только объект-указатель не может вызвать функцию в классе ... код выглядит следующим образом:
#include<iostream>
using namespace std;
class ABC{
public: ABC(){
cout<<"Hello"<<endl;
}
void disp(){
cout<<"Hi\n";
}
};
int main(){
ABC* b=(ABC*)malloc(sizeof(ABC));
int* q = new int[20];
ABC *a=new ABC();
b->disp();
cout<<b<<endl;
free(b);
delete b;
//a=NULL;
b->disp();
ABC();
cout<<b;
return 0;
}
вывод :
Hello Hi 0x2abfef37cc20
1. новый синтаксис проще, чем malloc ()
2.new/delete - оператор, в котором malloc () / free () - это функция.
3.new/delete выполняется быстрее, чем malloc () / free (), потому что новый ассемблерный код напрямую вставляется компилятором.
4. мы можем изменить / удалить новое значение в программе с помощью оператора overlading.