В чем разница между new/delete и malloc/free?
В чем разница между new
/delete
а также malloc
/free
?
Связанный (дубликат?): В каких случаях я использую malloc против new?
15 ответов
новый / удалить
- Выделить / освободить память
- Память, выделенная из "Free Store"
- Возвращает полностью типизированный указатель.
- new (стандартная версия) никогда не возвращает NULL (будет выдано при ошибке)
- Вызываются с Type-ID (компилятор вычисляет размер)
- Имеет версию явно для обработки массивов.
- Перераспределение (чтобы получить больше места) не обрабатывается интуитивно (из-за конструктора копирования).
- Будут ли они вызывать malloc/free, определяется реализацией.
- Может добавить новый распределитель памяти, чтобы справиться с нехваткой памяти (set_new_handler)
- оператор new/delete может быть переопределен юридически
- конструктор / деструктор, используемый для инициализации / уничтожения объекта
таНос / бесплатно
- Выделяет / освобождает память
- Память, выделенная из "Кучи"
- Возвращает пустоту *
- Возвращает NULL при ошибке
- Необходимо указать требуемый размер в байтах.
- Выделение массива требует ручного расчета пространства.
- Перераспределение большего объема памяти просто (не нужно беспокоиться о конструкторе копирования)
- Они НЕ будут звонить новые / удалить
- Нет способа разделить пользовательский код на последовательность выделения, чтобы помочь с нехваткой памяти.
- malloc/free НЕ может быть переопределено юридически
Таблица сравнения функций:
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
позвони дтору.
malloc
& free
просто выделите и освободите необработанную память.
new
/delete
это C++, malloc
/free
происходит от старого доброго С.
В C++ new
вызывает конструктор объектов и delete
вызывает деструктор.
malloc
а также free
Исходя из темных веков до ОО, только выделяем и освобождаем память, не выполняя никакого кода объекта.
В C++ new
/delete
вызвать конструктор / деструктор соответственно.
malloc
/free
просто выделите память из кучи. new
/delete
выделить память, а также.
Основное различие между new и malloc заключается в том, что new вызывает конструктор объекта, а соответствующий вызов delete вызывает деструктор объекта.
Есть и другие отличия:
new
типобезопасен,malloc
возвращает объекты типаvoid*
new
выдает исключение по ошибке,malloc
возвращаетсяNULL
и устанавливает errnonew
является оператором и может быть перегружен,malloc
это функция и не может быть перегруженаnew[]
, который распределяет массивы, является более интуитивным и безопасным для типов, чемmalloc
malloc
-изобретенные выделения могут быть изменены с помощьюrealloc
,new
распределение не может быть измененоmalloc
может выделить N-байтовый кусок памяти,new
нужно попросить выделить массив, скажем,char
типы
Смотря на различия, резюме - это malloc на C-esque, а новое на C++-esque. Используйте тот, который кажется правильным для вашей кодовой базы.
Хотя законно, что new и malloc реализуются с использованием разных алгоритмов выделения памяти, в большинстве систем new внутренне реализуется с использованием malloc, не приводя к разнице на уровне системы.
Единственное сходство в том, что malloc
/new
оба возвращают указатель, который обращается к некоторой памяти в куче, и оба гарантируют, что, как только такой блок памяти будет возвращен, он не будет возвращен снова, если вы сначала не освободите / удалите его. То есть они оба "выделяют" память.
Тем не мение, new
/delete
выполнять произвольную другую работу, кроме того, через конструкторы, деструкторы и перегрузки операторов. malloc
/free
только когда-нибудь выделяю и освобождаю память.
По факту, new
достаточно настраиваемый, чтобы не обязательно возвращать память из кучи или даже выделять память вообще. Однако по умолчанию new
делает.
Есть несколько вещей, которые new
делает это malloc
нет:
new
создает объект, вызывая конструктор этого объектаnew
не требует типизации выделенной памяти.- Для этого не нужно выделять объем памяти, скорее, для этого нужно несколько объектов.
Итак, если вы используете malloc
, то вам нужно делать вышеперечисленные вещи явно, что не всегда практично. Дополнительно, new
может быть перегружен, но malloc
не может быть
Одним словом, если вы используете C++, попробуйте использовать new
как можно больше.
Также,
глобальные new и delete могут быть переопределены, malloc/free - нет.
в дальнейшем более новые и удаляемые могут быть переопределены для каждого типа.
new
а также delete
являются примитивами C++, которые объявляют новый экземпляр класса или удаляют его (таким образом вызывая деструктор класса для экземпляра).
malloc
а также free
являются функциями C и они выделяют и освобождают блоки памяти (по размеру).
Оба используют кучу, чтобы сделать распределение. malloc
а также free
тем не менее, являются более "низкоуровневыми", поскольку они просто резервируют кусок памяти, который, вероятно, будет связан с указателем. Вокруг этой памяти не создаются никакие структуры (если только вы не считаете массив C структурой).
- new - это оператор, тогда как malloc () - это функция.
- new возвращает точный тип данных, тогда как malloc () возвращает void * (указатель типа void).
- malloc (), память не инициализируется и значение по умолчанию является мусором, тогда как в случае нового память инициализируется со значением по умолчанию, например, с 'zero (0)' в случае с int.
- delete и free () могут использоваться для указателей NULL.
new и delete являются операторами в C++; которые тоже могут быть перегружены. malloc и free являются функциями в c;
malloc возвращает ноль ptr, когда происходит сбой, а new создает исключение.
Адрес, возвращаемый функцией malloc, должен быть снова приведен к типу, так как он возвращает (void*)malloc(size). Новый возвращает типизированный указатель.
- Чтобы использовать
malloc()
нам нужно включить<stdlib.h>
или же<alloc.h>
в программе, которая не требуется дляnew
, new
а такжеdelete
может быть перегружен, ноmalloc
не могу.- Используя размещение
new
мы можем передать адрес, где мы хотим выделить память, но это невозможно в случаеmalloc
,
Этот код для использования ключевого слова удаления или свободной функции. Но при создании объекта указателя с помощью '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.