it-roy-ru.com

В чем разница между "new" и "malloc" и "calloc" в C ++?

В чем разница между "новым" и "malloc" и "calloc" и другими в семье?

(Когда) Нужно ли что-нибудь, кроме "нового"?

Один из них реализован с использованием какого-либо другого?

51
Łukasz Lew

new и delete являются специфическими особенностями C++. Они не существовали в C. malloc - это старый способ C делать вещи. В большинстве случаев вам не нужно использовать его в C++.

  • malloc выделяет неинициализированную память. Выделенная память должна быть освобождена с free.
  • calloc похож на malloc, но инициализирует выделенную память константой (0). Это должно быть освобождено с free.
  • new инициализирует выделенную память, вызывая конструктор (если это объект). Память, выделенная с помощью new, должна быть освобождена с delete (которая, в свою очередь, вызывает деструктор). Вам не нужно вручную указывать нужный размер и приводить его к соответствующему типу. Таким образом, он более современный и менее подвержен ошибкам.
70
Mehrdad Afshari

new/delete + new []/delete []:

  • new/delete - это способ C++ для выделения памяти и освобождения памяти из кучи.
  • new [] и delete [] - это способ C++ для выделения массивов непрерывной памяти.
  • Следует использовать, потому что это более безопасный тип, чем malloc
  • Должен использоваться, потому что он вызывает конструктор/деструктор
  • Не может использоваться в режиме реального времени, но может использовать новое размещение для повторного использования того же буфера данных
  • Данные не могут быть размещены как новые, так и освобождены как свободные, так и не удалены []

malloc/free + family:

  • malloc/free/family - это способ выделения и освобождения памяти из кучи.
  • calloc аналогичен malloc, но также инициализирует память
  • Следует использовать, если вам может потребоваться перераспределить память
  • Данные не могут быть распределены с помощью malloc и освобождены с помощью delete или delete []

Также смотрите мой связанный ответ здесь

20
Brian R. Bondy
  • new выделяет и вызывает ctor (порядок не указан), удаляет dtor и освобождает память, выделенную при вызове new
  • malloc только выделяет часть памяти, free удаляет память, выделенную malloc
  • new может быть реализован с использованием malloc (не требуется по стандарту)
  • calloc делает то же самое, что и malloc, а также обнуляет вновь выделенную память

Как отмечалось в других статьях: malloc/free является частью C++, чтобы быть совместимым с C.

Также смотрите: Страуструп: новый против malloc

8
dirkgently

Использование новых означает, что конструкторы будут вызываться во вновь выделенной памяти. Если у выделенной вещи нет конструкторов, new функционально идентичен malloc. и, как правило, должны использоваться в отношении этого.

new может или не может быть реализован в терминах malloc - стандарт C++ не требует ни одного подхода.

5
anon

Вам не нужно ничего, кроме нового. Это полная замена malloc в C++.

Что касается разницы: Malloc просто выделяет память. Новая память выделяется и вызывает конструкторы. Точно так же бесплатно просто освобождает память. Delete освобождает память и вызывает деструктор.

Слово предупреждения: не смешивайте две идиомы. Результаты не определены.

5
Steve Rowe

я могу вспомнить основное различие между new и malloc в том, что вы не можете перераспределить память, выделенную new, используя realloc. Поэтому, если вы хотите увеличить/уменьшить размер блока памяти, вам нужно было выделить новый блок и скопировать все заново.

Calloc позволяет инициализировать блок памяти, который вы выделяете, а malloc - нет.

1
z -

Когда вы новый объект, пространство для объекта не только выделяется, но и вызывается конструктор объекта. Но это C++, как это делается, malloc это старая версия способа C выделения памяти. calloc то же самое, что и malloc, за исключением того, что очищает память до всех нулевых битов.

1
TStamper