В чем разница между новыми /delete и malloc/free?
В чем разница между new
/delete
и malloc
/free
?
Связанный (duplicate?): В каких случаях я использую malloc vs new?
Ответы
Ответ 1
новый/удалить
- Выделить/освободить память
- Память, выделенная из "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 нельзя смешивать.
Ответ 2
Самое важное отличие состоит в том, что оператор new
выделяет память, затем вызывает конструктор, а delete
вызывает деструктор, а затем освобождает память.
Ответ 3
new
вызывает ctor объекта, delete
вызывает dtor.
malloc
и free
просто выделяют и освобождают необработанную память.
Ответ 4
В С++ new
/delete
соответственно вызовите конструктор/деструктор.
malloc
/free
просто выделите память из кучи. new
/delete
также выделяет память.
Ответ 5
new
/delete
- это С++, malloc
/free
- это старый добрый C.
В С++ new
вызывает конструктор объектов, а delete
вызывает деструктор.
malloc
и free
, исходящие из темных веков до OO, выделяют и освобождают память без выполнения какого-либо кода объекта.
Ответ 6
Единственное сходство заключается в том, что malloc
/new
возвращают указатель, который обращается к некоторой памяти в куче, и оба гарантируют, что как только такой блок памяти будет возвращен, он не будет возвращен снова, если только вы бесплатно или сначала удаляете его. То есть, они оба "распределяют" память.
Однако new
/delete
выполняет произвольную другую работу, кроме того, через конструкторы, деструкторы и перегрузку оператора. malloc
/free
только выделяет и освобождает память.
Фактически, new
достаточно настраивается, что он не обязательно возвращает память из кучи или даже выделяет память вообще. Однако по умолчанию используется new
.
Ответ 7
Основное отличие между 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, что не приводит к различию на системном уровне.
Ответ 8
Есть несколько вещей, которые new
делает malloc
doesnt:
-
new
создает объект, вызывая конструктор этого объекта
-
new
не требует типизации выделенной памяти.
- Он не требует выделения объема памяти, а требует нескольких
объекты, которые будут созданы.
Итак, если вы используете malloc
, то вам нужно делать вещи выше явно, что не всегда практично. Кроме того, new
может быть перегружен, но malloc
не может быть.
Одним словом, если вы используете С++, попробуйте как можно больше использовать new
.
Ответ 9
и
глобальное новое и удаление могут быть переопределены, malloc/free не может.
далее новые и удаленные могут быть переопределены для каждого типа.
Ответ 10
new
и delete
являются примитивами С++, которые объявляют новый экземпляр класса или удаляют его (тем самым вызывая деструктор класса для экземпляра).
malloc
и free
являются функциями C, и они выделяют и освобождают блоки памяти (по размеру).
Оба используют кучу для выделения. malloc
и free
, тем не менее, более "низкий уровень", поскольку они просто резервируют кусок пространства памяти, который, вероятно, будет связан с указателем. Никаких структур не создается вокруг этой памяти (если вы не считаете массив C как структуру).
Ответ 11
new и delete - операторы в С++; который также может быть перегружен.
malloc и free являются функциями в c;
malloc возвращает null ptr при сбое, в то время как исключение new throws.
адрес, возвращаемый malloc, должен по типу, забрасываемому снова, когда он возвращает (void *) malloc (размер)
Новый возвращает введенный указатель.
Ответ 12
- new является оператором, тогда как malloc() является fucntion.
- new возвращает точный тип данных, а malloc() возвращает void * (указатель типа void).
- malloc(), память не инициализируется, а значением по умолчанию является мусор, тогда как в случае новой память инициализируется значением по умолчанию, например, с нулем (0) 'в случае с int.
- delete и free() оба могут использоваться для указателей "NULL".
Ответ 13
- Чтобы использовать
malloc()
, нам нужно включить <stdlib.h>
или
<alloc.h>
в программе, которая не требуется для new
.
-
new
и delete
могут быть перегружены, но malloc
не может.
- Используя размещение
new
, мы можем передать адрес, где мы хотим
выделять память, но это невозможно в случае malloc
.
Ответ 14
Этот код для использования ключевого слова 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
Ответ 15
Память, выделенная с помощью new
, имеет специальное пространство, зарезервированное для хранения книг (вызов справочной информации), который используется для указания адресов constructor
и destructor
. Это не в случае malloc
.
Когда malloc
выделяет деструктор памяти, предполагается вызывать, но явно используя ключевое слово delete
. что деструктор расположен с использованием справочника по хранению.
Ответ 16
1. Новый синтакс проще, чем malloc()
2.new/delete - это оператор, где malloc()/free()
является функцией.
3.new/delete выполняется быстрее, чем malloc()/free(), потому что новый код сборки непосредственно вставляется компилятором.
4. Мы можем изменить значение new/delete в программе с помощью переадресации оператора.