15 ответов:
новый/удалить
- выделить/освободить память
- память, выделенная из "свободного магазина"
- возвращает полностью типизированный указатель.
- new (стандартная версия) никогда не возвращает NULL (будет бросать при сбое)
- вызываются с типом-ID (компилятор вычисляет размер)
- имеет версию явно для обработки массивов.
- перераспределение (чтобы получить больше места) не обрабатывается интуитивно (из-за копирования конструктор.)
- ли они называют malloc / free определяется реализация.
- можно добавить новый распределитель памяти для работы с низкой памятью (set_new_handler)
- оператор new/delete может быть переопределен юридически
- конструктор / деструктор, используемый для инициализации / уничтожения объекта
malloc / free
- выделение/освобождение памяти
- память выделяется из "Куча"
- возвращает void*
- возвращает NULL при сбое
- необходимо указать требуемый размер в байтах.
- выделение массива требует ручного вычисления пространства.
- перераспределение большего куска памяти просто (нет конструктора копирования, чтобы беспокоиться о)
- они не вызов new / delete
- нет способа объединить код пользователя в последовательность выделения, чтобы помочь с низкой памятью.
- malloc / free can не быть отменены юридически
таблица сравнения функций:
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технически память, выделенную новое происходит от 'интернет-магазин' в то время как память, выделенную с помощью функции malloc происходит из 'кучи'. Являются ли эти две области одинаковыми-это детали реализации, что является еще одной причиной того, что malloc и new не могут быть смешаны.
наиболее важным отличием является то, что
newоператор выделяет память, вызывает конструктор, иdeleteвызывает деструктор, затем освобождает память.
newвызывается конструктор объекта,deleteвызовите dtor.
malloc&freeпросто выделите и отпустите необработанную память.
В C++
new/deleteвызовите конструктор / деструктор соответственно.
malloc/freeпросто выделить память из кучи.new/deleteкак выделить память.
new/deleteЭто C++,malloc/freeпроисходит от старого доброго C.В C++,
newвызывает конструктор объектов иdeleteвызывает деструктор.
mallocиfree, исходя из темных веков до OO, только Выделите и освободите память, не выполняя никакого кода объекта.
единственное сходство в том, что
,malloc/newоба возвращают указатель, который обращается к некоторой памяти в куче, и они оба гарантируют, что как только такой блок памяти будет возвращен, он не будет возвращен снова, если вы сначала не освободите/удалите его. То есть они оба "выделяют" память.new/deleteвыполнять произвольную другую работу дополнительно, через конструкторы, деструкторы и перегрузку оператора.malloc/freeтолько когда-либо выделять и бесплатно память.в самом деле
newдостаточно настраиваемый, что он не обязательно возвращает память из кучи или даже выделяет память вообще. Однако по умолчаниюnewделает.
есть несколько вещей, которые
newЭтоmallocнет:
newсоздает объект, вызывая конструктор этого объектаnewне требует типизации выделенной памяти.- для этого не требуется выделять объем памяти, а требуется ряд объекты, которые будут построены.
если вы используете
malloc, то вам нужно сделать выше вещи явно, что не является всегда практично. Кроме того,newможет быть перегружен, ноmallocне может быть.одним словом, если вы используете c++, попробуйте использовать
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-стиле, новое в C++-стиле. Используйте тот, который подходит для вашей базы кода.
хотя законно, чтобы new и malloc были реализованы с использованием различных алгоритмов выделения памяти, в большинстве систем new внутренне реализуется с использованием malloc, не давая разницы на системном уровне.
и
глобальное новое и удаление может быть переопределено, malloc / free не может.
далее new и Delete можно переопределить для каждого типа.
newиdeleteв C++ примитивы которые объявляют новый экземпляр класса или удаляют его (таким образом вызывая деструктор класса для экземпляра).
mallocиfreeС функции и они выделяют и освобождают блоки памяти (по размеру).оба используют кучу, чтобы сделать выделение.
mallocиfreeтем не менее, более "низкий уровень", поскольку они просто резервируют кусок пространства памяти, который, вероятно, будет связан с указателем. Никакие структуры не создаются вокруг этой памяти (если вы не считаете массив C структурой).
new и delete-это операторы в c++; которые также могут быть перегружены. malloc и free являются функцией в c;
malloc возвращает null ptr при сбое во время нового исключения бросков.
адрес, возвращенный malloc нужно по типу casted снова, как он возвращает (void*)malloc (размер) Новая возвращать типизированный указатель.
- new-это оператор, тогда как malloc () - это функция.
- new возвращает точный тип данных, в то время как malloc() возвращает void * (указатель типа void).
- malloc (), память не инициализируется и значение по умолчанию является мусором, тогда как в случае new память инициализируется значением по умолчанию, например, с "нулем (0)" в случае int.
- delete и free() оба могут использоваться для указателей 'NULL'.
- использовать
malloc()нужно включить<stdlib.h>или<alloc.h>в программе, которая не требуется дляnew.newиdeleteможет быть перегружен, ноmallocне может.- используя размещение
new, мы можем передать адрес, где мы хотим выделить память, но это невозможно в случаеmalloc.
этот код для использования ключевого слова delete или свободной функции. Но когда создать объект указателя с помощью 'malloc' или ' new ' и освободить память объекта с помощью удалить даже этот указатель объекта можно вызвать функцию в классе. После что использовать бесплатно вместо удаления, то и он работает после свободного заявления , но при использовании обоих тогда только объект указателя не может вызвать функцию в классе.. код выглядит следующим образом :
#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.
Comments