В чем разница между 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 в программе с помощью переадресации оператора.