В чем разница между new / delete и malloc / free? - PullRequest
274 голосов
/ 27 октября 2008

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

Похожие (дубликаты?): В каких случаях я использую malloc против new?

Ответы [ 15 ]

451 голосов
/ 27 октября 2008

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

  • Распределить / освободить память
    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 нельзя смешивать.

79 голосов
/ 27 октября 2008

Наиболее существенным отличием является то, что оператор new выделяет память, затем вызывает конструктор, а delete вызывает деструктор, а затем освобождает память.

29 голосов
/ 27 октября 2008

new вызывает ctor объекта, delete вызывает dtor.

malloc & free просто выделить и освободить необработанную память.

13 голосов
/ 27 октября 2008

В C ++ new / delete вызвать конструктор / деструктор соответственно.

malloc / free просто выделить память из кучи. new / delete также выделяем память.

12 голосов
/ 27 октября 2008

new / delete - это C ++, malloc / free происходит от старого доброго C.

В C ++ new вызывает конструктор объектов, а delete вызывает деструктор.

malloc и free, пришедшие из темных веков до ОО, только выделяют и освобождают память без выполнения какого-либо кода объекта.

10 голосов
/ 27 октября 2008

Единственное сходство состоит в том, что malloc / new оба возвращают указатель, который обращается к некоторой памяти в куче, и они оба гарантируют, что, как только такой блок памяти будет возвращен, он не будет возвращен, если только Вы освобождаете / удаляете это сначала. То есть они оба «выделяют» память.

Однако, new / delete выполняет произвольную другую работу, кроме того, через конструкторы, деструкторы и перегрузку операторов. malloc / free только когда-либо выделяет и освобождает память.

Фактически, new достаточно настраиваем, чтобы не обязательно возвращать память из кучи или даже выделять память вообще. Однако по умолчанию new делает.

6 голосов
/ 08 октября 2014

Основное различие между new и malloc заключается в том, что new вызывает конструктор объекта, а соответствующий вызов delete вызывает деструктор объекта.

Есть и другие отличия:

  • new является типобезопасным, malloc возвращает объекты типа void*

  • new выдает исключение при ошибке, malloc возвращает NULL и устанавливает errno

  • new является оператором и может быть перегружен, malloc является функцией и не может быть перегружен

  • new[], который распределяет массивы, более интуитивно понятен и безопасен для типов, чем malloc

  • malloc выделенные ресурсы могут быть изменены с помощью realloc, new выделенные выделения не могут быть изменены

  • malloc может выделять N-байтовый фрагмент памяти, new необходимо попросить выделить массив, скажем, char типов

С учетом различий, сводка malloc - это C-esque, new - это C ++ - esque. Используйте тот, который подходит для вашей базы кода.

Хотя законно, что new и malloc реализуются с использованием разных алгоритмов выделения памяти, в большинстве систем new внутренне реализован с использованием malloc, не приводя к разнице в уровне системы.

5 голосов
/ 15 января 2014

Есть несколько вещей, которые new делает, что malloc не делает:

  1. new создает объект, вызывая конструктор этого объекта
  2. new не требует типизации выделенной памяти.
  3. Для этого не требуется выделять объем памяти, а требуется несколько объекты для строительства.

Так что, если вы используете malloc, то вам нужно явно выполнить все вышеперечисленное, что не всегда практично. Кроме того, new может быть перегружен, но malloc не может быть.

Одним словом, если вы используете C ++, попробуйте использовать new как можно больше.

4 голосов
/ 27 октября 2008

также

глобальные new и delete могут быть переопределены, malloc / free не может.

более новые и удаляемые могут быть переопределены для каждого типа.

3 голосов
/ 27 октября 2008

new и delete являются примитивами C ++ , которые объявляют новый экземпляр класса или удаляют его (таким образом вызывая деструктор класса для экземпляра).

malloc и free являются функциями C , и они выделяют и освобождают блоки памяти (по размеру).

Оба используют кучу, чтобы сделать распределение. malloc и free, тем не менее, являются более «низкоуровневыми», поскольку они просто резервируют часть памяти, которая, вероятно, будет связана с указателем. Вокруг этой памяти не создается никаких структур (если только вы не считаете массив C структурой).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...