В чем разница между 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.