В чем разница между "новыми" и "malloc" и "calloc" в С++?
В чем разница между "новыми" и "malloc" и "calloc" и другими в семье?
(Когда) Нужно ли что-нибудь, кроме "нового"?
Один из них реализован с использованием любого другого?
Ответы
Ответ 1
new
и delete
являются специфическими для С++ функциями. Они не существовали в C. malloc
- это старая школа, способная делать вещи. В большинстве случаев вам не нужно использовать его в С++.
-
malloc
выделяет неинициализированную память. Выделенная память должна быть освобождена с помощью free
.
-
calloc
похож на malloc
, но инициализирует выделенную память константой (0). Его нужно освободить с помощью free
.
-
new
инициализирует выделенную память, вызывая конструктор (если это объект). Память, выделенная с помощью new
, должна быть выпущена с помощью delete
(которая, в свою очередь, вызывает деструктор). Вам не нужно вручную указывать необходимый размер и применять его к соответствующему типу. Таким образом, он более современный и менее подвержен ошибкам.
Ответ 2
new/delete + new []/delete []:
- new/delete - это способ С++ для выделения памяти и освобождения памяти из кучи.
- new [] и delete [] - это способ С++ для распределения массивов непрерывной памяти.
- Должен использоваться, поскольку он более безопасен по типу, чем malloc
- Должен использоваться, поскольку он вызывает конструктор/деструктор
- Невозможно использовать в режиме realloc, но может использовать новое место для повторного использования одного и того же буфера данных.
- Данные не могут быть выделены новыми и освобождены с помощью бесплатной или удаленной []
malloc/free + family:
- malloc/free/family - это способ передачи и освобождения памяти из кучи.
- calloc - это то же самое, что и malloc, но также инициализирует память
- Должно использоваться, если вам потребуется перераспределить память
- Данные не могут быть выделены с помощью malloc и освобождены с удалением или удалением []
Также см. мой ответ здесь
Ответ 3
- new выделяет и вызывает ctor (порядок не указан), удаляет dtor и освобождает память, выделенную вызовом, для нового
- malloc только выделяет некоторую память, освобождает память, выделенную malloc
- new может быть реализован с использованием malloc (не обязательно стандартным)
- calloc делает то же самое, что и malloc, а также обнуляет вновь выделенную память
Как указывали другие сообщения: malloc/free является частью С++ для совместимости с C.
Также см.: Stroustrup: новый vs malloc
Ответ 4
Использование новых средств, которые будут вызывать конструкторы для вновь выделенной памяти. Если выделенная вещь не имеет конструкторов, новый функционально идентичен malloc. и обычно должен использоваться в отношении к нему.
new может или не может быть реализовано в терминах malloc - стандарт С++ не требует ни одного подхода.
Ответ 5
Вам не нужно ничего, кроме нового. Это полная замена malloc в С++.
Что касается разницы: Malloc просто выделяет память. Новая выделенная память и вызывает конструкторы. Также бесплатно освобождает память. Удалить освобождает память и вызывает деструктор.
Слово предупреждения: не смешивайте две идиомы. Результаты: undefined.
Ответ 6
Основное различие между new и malloc я могу вспомнить, так это то, что вы не можете перераспределять память, выделенную новым, используя realloc. Поэтому, если вы хотели увеличить/уменьшить размер блока памяти, вам пришлось выделить новый блок и скопировать все.
Calloc позволяет вам инициализировать блок памяти, который вы выделяете, в то время как malloc не делает.
Ответ 7
Когда вы новый объект, пространство для объекта не только выделяется, но вызывается конструктор объекта. Но это способ С++, который он сделал, malloc - это старая версия в C выделения памяти. calloc совпадает с malloc, за исключением того, что он очищает память до всех битов 0.