В чем разница между new
/delete
и malloc
/free
?
Связанный (duplicate?): В каких случаях я использую malloc vs new?
В чем разница между new
/delete
и malloc
/free
?
Связанный (duplicate?): В каких случаях я использую malloc vs 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 нельзя смешивать.
Самое важное отличие состоит в том, что оператор new
выделяет память, затем вызывает конструктор, а delete
вызывает деструктор, а затем освобождает память.
new
вызывает ctor объекта, delete
вызывает dtor.
malloc
и free
просто выделяют и освобождают необработанную память.
В С++ new
/delete
соответственно вызовите конструктор/деструктор.
malloc
/free
просто выделите память из кучи. new
/delete
также выделяет память.
new
/delete
- это С++, malloc
/free
- это старый добрый C.
В С++ new
вызывает конструктор объектов, а delete
вызывает деструктор.
malloc
и free
, исходящие из темных веков до OO, выделяют и освобождают память без выполнения какого-либо кода объекта.
Единственное сходство заключается в том, что malloc
/new
возвращают указатель, который обращается к некоторой памяти в куче, и оба гарантируют, что как только такой блок памяти будет возвращен, он не будет возвращен снова, если только вы бесплатно или сначала удаляете его. То есть, они оба "распределяют" память.
Однако new
/delete
выполняет произвольную другую работу, кроме того, через конструкторы, деструкторы и перегрузку оператора. malloc
/free
только выделяет и освобождает память.
Фактически, new
достаточно настраивается, что он не обязательно возвращает память из кучи или даже выделяет память вообще. Однако по умолчанию используется new
.
Основное отличие между new и malloc заключается в том, что new вызывает конструктор объекта, а соответствующий вызов для удаления вызывает деструктор объекта.
Существуют и другие отличия:
new
безопасен по типу, malloc
возвращает объекты типа void*
new
выдает исключение при ошибке, malloc
возвращает NULL
и устанавливает errno
new
является оператором и может быть перегружен, malloc
является функцией и не может быть перегружен
new[]
, который выделяет массивы, более интуитивно понятен и безопасен по типу, чем malloc
malloc
-изложенные распределения могут быть изменены с помощью realloc
, new
-распределенные распределения не могут быть изменены
malloc
может выделить N-байтовый блок памяти, new
должен быть запрошен для распределения массива, скажем, char
types
Рассматривая различия, итоговое значение malloc - это C-esque, new - С++-esque. Используйте тот, который кажется правильным для вашей базы кода.
Несмотря на то, что для новых и malloc является законным использование с использованием разных алгоритмов распределения памяти, в большинстве систем новое внутренне реализуется с использованием malloc, что не приводит к различию на системном уровне.
Есть несколько вещей, которые new
делает malloc
doesnt:
new
создает объект, вызывая конструктор этого объектаnew
не требует типизации выделенной памяти.Итак, если вы используете malloc
, то вам нужно делать вещи выше явно, что не всегда практично. Кроме того, new
может быть перегружен, но malloc
не может быть.
Одним словом, если вы используете С++, попробуйте как можно больше использовать new
.
и
глобальное новое и удаление могут быть переопределены, malloc/free не может.
далее новые и удаленные могут быть переопределены для каждого типа.
new
и delete
являются примитивами С++, которые объявляют новый экземпляр класса или удаляют его (тем самым вызывая деструктор класса для экземпляра).
malloc
и free
являются функциями C, и они выделяют и освобождают блоки памяти (по размеру).
Оба используют кучу для выделения. malloc
и free
, тем не менее, более "низкий уровень", поскольку они просто резервируют кусок пространства памяти, который, вероятно, будет связан с указателем. Никаких структур не создается вокруг этой памяти (если вы не считаете массив C как структуру).
new и delete - операторы в С++; который также может быть перегружен. malloc и free являются функциями в c;
malloc возвращает null ptr при сбое, в то время как исключение new throws.
адрес, возвращаемый malloc, должен по типу, забрасываемому снова, когда он возвращает (void *) malloc (размер) Новый возвращает введенный указатель.
malloc()
, нам нужно включить <stdlib.h>
или
<alloc.h>
в программе, которая не требуется для new
.new
и delete
могут быть перегружены, но malloc
не может.new
, мы можем передать адрес, где мы хотим
выделять память, но это невозможно в случае malloc
.Этот код для использования ключевого слова delete или свободной функции. Но при создании используя объект "malloc" или "новый" и освободить память объекта, используя delete даже этот указатель объекта может быть функцией вызова в классе. После которые используют бесплатно вместо удаления, а затем он работает после бесплатной инструкции, но при использовании как тогда, так и только объект-указатель не может вызвать функцию в классе. код выглядит следующим образом:
#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
Память, выделенная с помощью new
, имеет специальное пространство, зарезервированное для хранения книг (вызов справочной информации), который используется для указания адресов constructor
и destructor
. Это не в случае malloc
.
Когда malloc
выделяет деструктор памяти, предполагается вызывать, но явно используя ключевое слово delete
. что деструктор расположен с использованием справочника по хранению.
1. Новый синтакс проще, чем malloc()
2.new/delete - это оператор, где malloc()/free() является функцией.
3.new/delete выполняется быстрее, чем malloc()/free(), потому что новый код сборки непосредственно вставляется компилятором.
4. Мы можем изменить значение new/delete в программе с помощью переадресации оператора.