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

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

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

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

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

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

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

Технически память, выделенная новым, поступает из «Свободного магазина», а память, выделенная 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 , исходя из темных веков до OO, выделяют и освобождают память, не выполняя никакого кода объекта.

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

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

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

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

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

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

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

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

Существуют и другие отличия:

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

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

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

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

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

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

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

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

также,

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

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

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

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

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

new и delete – операторы в c ++; который также может быть перегружен. malloc и free являются функциями c;

malloc возвращает null ptr при сбое, в то время как исключение новых исключений.

адрес, возвращаемый malloc, должен по типу, забрасываемому снова, когда он возвращает (void *) malloc (size). Новый возвращает введенный указатель.

  • new является оператором, тогда как malloc () является fucntion.
  • новый возвращает точный тип данных, а malloc () возвращает void * (указатель типа void).
  • malloc (), память не инициализируется, а значением по умолчанию является мусор, тогда как в случае новой память инициализируется значением по умолчанию, например, с нулем (0) ‘в случае с int.
  • delete и free () оба могут использоваться для указателей «NULL».
  • Чтобы использовать malloc() , нам нужно включить или в программу, которая не требуется для new .
  • new и delete могут быть перегружены, но malloc не может.
  • Используя new место размещения, мы можем передать адрес, где мы хотим выделить память, но это невозможно в случае malloc .

Этот код используется для использования ключевого слова delete или свободной функции. Но при создании объекта-указателя с использованием «malloc» или «new» и освобождения памяти объекта с помощью delete даже этот указатель объекта может быть функцией вызова в classе. После этого используйте бесплатно вместо удаления, а затем он работает после бесплатного оператора, но при использовании и то, что только объект-указатель не может вызвать функцию в classе .. код выглядит следующим образом:

 #include using namespace std; class ABC{ public: ABC(){ cout<<"Hello"<disp(); cout<disp(); ABC(); cout< 

вывод :

 Hello Hi 0x2abfef37cc20 

1.new syntex проще, чем malloc ()

2.new/delete – это оператор, где функция malloc () / free () является функцией.

3.new/delete выполняется быстрее, чем malloc () / free (), потому что новый код сборки непосредственно вставляется компилятором.

4. мы можем изменить новый / удалить значение в программе с помощью перегрузки оператора.

  • Разделение памяти Android
  • Go 1.3 Сборщик мусора, не отбрасывающий серверную память обратно в систему
  • В каких случаях я использую malloc vs new?
  • Почему NSNumber такие странные saveCounts?
  • Освобождает выделенную память, необходимую при выходе из программы на C
  • Трюки для управления доступной памятью в сеансе R
  • распределение памяти типов значений и ссылочных типов в инфраструктуре .net
  • Высокое потребление памяти с помощью Enumerable.Range?
  • почему размер памяти стека настолько ограничен?
  • Объем памяти типов данных Haskell
  • Адрес памяти C # и переменная
  • Давайте будем гением компьютера.