Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 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.