0

Какова разница между "new", "malloc" и "calloc" в C++?

13

Проблема: Разница между new и malloc/calloc в C++

Здравствуйте,

У меня возник вопрос относительно разницы между операциями выделения памяти в C++. Я знаю, что в языке C++ существуют различные способы выделения памяти, такие как new, malloc, calloc и другие функции семейства. Однако я не совсем понимаю, в чем именно заключается разница между ними и когда следует использовать тот или иной метод.

  1. Разница между new, malloc и calloc: Какие замечания можно сделать по поводу этих операторов выделения памяти? Каковы основные отличия в их работе и применения?

  2. Когда использовать new: Есть ли случаи, когда использование new не является оптимальным, и предпочтительно использовать другие методы, такие как malloc или calloc? Какая практика предпочтительнее в современных C++ проектах?

  3. Зависимость реализации: Существует ли между этими функциями какая-либо зависимость, например, использует ли new какую-либо из этих функций под капотом или наоборот?

Буду признателен за разъяснения и примеры использования, так как это может помочь мне лучше понять механизм управления памятью в C++. Спасибо!

5 ответ(ов)

0

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

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

Вы не нуждаетесь ни в чем, кроме new. Он является полным заменителем malloc в C++.

Что касается различий: malloc просто выделяет память. new выделяет память и вызывает конструкторы. Аналогично, free просто освобождает память, тогда как delete освобождает память и вызывает деструкторы.

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

0

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

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

0

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

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

0

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

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь