В чем разница между new/delete и malloc/free?
в чем разница между new
/delete
и malloc
/free
?
обзоры (дубликат?): в каких случаях я использую malloc против new?
15 ответов
новый/удалить
- выделить/освободить память
- память, выделенная из "Free Store"
- возвращает полностью типизированный указатель.
- new (стандартная версия) никогда не возвращает NULL (будет бросать при сбое)
- вызываются с Type-ID (компилятор вычисляет размер)
- имеет версию явно для обработки массивов.
- перераспределение (чтобы получить больше места) не обрабатывается интуитивно (из-за копирования конструктор.)
- ли они называют malloc/free определяется реализация.
- можно добавить новый распределитель памяти для работы с низкой памятью (set_new_handler)
- оператор new/delete может быть переопределен юридически
- конструктор / деструктор, используемый для инициализации / уничтожения объекта
аналог
- выделение/освобождение памяти
- память выделяется из 'Куча'
- возвращает void*
- возвращает NULL при сбое
- необходимо указать требуемый размер в байтах.
- выделение массива требует ручного вычисления пространства.
- перераспределение большего куска памяти просто (нет конструктора копирования, чтобы беспокоиться)
- они не вызов new / delete
- нет способа объединить код пользователя в последовательность выделения, чтобы помочь с низкой памятью.
- аналог, может не быть отменен юридически
таблица сравнения функций:
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, поступает из "свободного хранилища", а память, выделенная malloc, поступает из "кучи". Являются ли эти две области одинаковыми-это детали реализации, что является еще одной причиной того, что malloc и new не могут быть смешаны.
наиболее важным отличием является то, что new
оператор выделяет память, вызывает конструктор, и delete
вызывает деструктор, затем освобождает память.
new
вызывает ctor объекта,delete
вызовите dtor.
malloc
& free
просто выделите и отпустите необработанную память.
В C++ new
/delete
вызовите конструктор / деструктор соответственно.
malloc
/free
просто выделить память из кучи. new
/delete
как выделить память.
new
/delete
Это C++,malloc
/free
исходит от старого доброго C.
В C++, new
вызывает конструктор объектов и delete
вызывает деструктор.
malloc
и free
, исходя из темных веков до ОО, только выделяйте и освобождайте память, не выполняя никакого кода объекта.
единственное сходство в том, что 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
и устанавливает errnonew
- оператор и может быть перегружен,malloc
является функцией и не может быть перегруженnew[]
, который выделяет массивы, является более интуитивным и безопасным по типу, чемmalloc
malloc
- производные распределения могут быть изменены с помощьюrealloc
,new
-производные распределения не могут быть измененыmalloc
может выделить N-байтовый кусок памяти,new
необходимо попросить выделить массив, скажем,char
типы
глядя на различия, резюме malloc-это C-esque, new-C++ - esque. Используйте тот, который подходит для вашей базы кода.
хотя законно, чтобы 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, нужно по типу, приведенному снова, поскольку он возвращает (void*)malloc (размер) New возвращает типизированный указатель.
- new является оператором, тогда как malloc() является fucntion.
- 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", и освобождает память объекта, используя удалить даже этот указатель объекта может быть функцией вызова в классе. После которые используют free вместо delete, а затем также работают после free statement , но при использовании обоих тогда только объект указателя не может вызывать функцию в классе.. код выглядит следующим образом :
#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.новый syntex проще, чем malloc()
2.new / delete-оператор, где malloc ()/бесплатно() это функция.
3.new / delete выполняется быстрее, чем malloc()/free (), потому что новый код сборки непосредственно вставляется компилятором.
4.мы можем изменить новое / удалить значение в программе с помощью оператора overlading.