В чем разница между новыми /delete и malloc/free? - программирование

В чем разница между новыми /delete и malloc/free?

В чем разница между new/delete и malloc/free?

Связанный (duplicate?): В каких случаях я использую malloc vs new?

4b9b3361

Ответ 1

новый/удалить

  • Выделить/освободить память
    1. Память, выделенная из "Free Store"
    2. Возвращает полностью типизированный указатель.
    3. new (стандартная версия) никогда не возвращает NULL (будет выдано при ошибке)
    4. Вызываются с Type-ID (компилятор вычисляет размер)
    5. Имеет версию для работы с массивами.
    6. Перераспределение (чтобы получить больше места) не обрабатывается интуитивно (из-за конструктора копирования).
    7. Будут ли они вызывать malloc/free, определяется реализацией.
    8. Можно добавить новый распределитель памяти для решения проблемы нехватки памяти (set_new_handler)
    9. оператор new/delete может быть переопределен юридически
    10. конструктор/деструктор, используемый для инициализации/уничтожения объекта

таНос/бесплатно

  • Выделяет/освобождает память
    1. Память, выделенная из "Кучи"
    2. Возвращает пустоту *
    3. Возвращает NULL при ошибке
    4. Необходимо указать требуемый размер в байтах.
    5. Выделение массива требует ручного расчета пространства.
    6. Простое перераспределение большего объема памяти (не нужно беспокоиться о конструкторе копирования)
    7. Они НЕ звонят новым/удаляют
    8. Нет способа разделить пользовательский код на последовательность размещения, чтобы помочь с нехваткой памяти.
    9. 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 в программе с помощью переадресации оператора.