В чем разница между “new” и “malloc”, а также “calloc” в C ++?[дубликат]
-
03-07-2019 - |
Вопрос
В чем разница между "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 о выделении памяти. каллок это то же самое , что маллок, за исключением того, что он очищает память до всех нулевых битов.