В чем разница между “new” и “malloc”, а также “calloc” в C ++?[дубликат]

StackOverflow https://stackoverflow.com/questions/807939

Вопрос

В чем разница между "new" и "malloc", а также "calloc" и другими членами семьи?

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

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

Это было полезно?

Решение

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

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

Другие советы

создать/удалить + создать[]/удалить[]:

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

malloc/свободный + семейный:

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

Также смотрите мой соответствующий ответ здесь

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

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

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

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top