Какова разница между "new", "malloc" и "calloc" в C++?
Проблема: Разница между new
и malloc
/calloc
в C++
Здравствуйте,
У меня возник вопрос относительно разницы между операциями выделения памяти в C++. Я знаю, что в языке C++ существуют различные способы выделения памяти, такие как new
, malloc
, calloc
и другие функции семейства. Однако я не совсем понимаю, в чем именно заключается разница между ними и когда следует использовать тот или иной метод.
Разница между
new
,malloc
иcalloc
: Какие замечания можно сделать по поводу этих операторов выделения памяти? Каковы основные отличия в их работе и применения?Когда использовать
new
: Есть ли случаи, когда использованиеnew
не является оптимальным, и предпочтительно использовать другие методы, такие какmalloc
илиcalloc
? Какая практика предпочтительнее в современных C++ проектах?Зависимость реализации: Существует ли между этими функциями какая-либо зависимость, например, использует ли
new
какую-либо из этих функций под капотом или наоборот?
Буду признателен за разъяснения и примеры использования, так как это может помочь мне лучше понять механизм управления памятью в C++. Спасибо!
5 ответ(ов)
new
и delete
– это особенности, специфичные для C++. Они не существовали в C. malloc
– это старый способ выделения памяти в C, и в большинстве случаев в C++ вам не нужно его использовать.
malloc
выделяет неинициализированную память. Выделенную память необходимо освободить с помощьюfree
.calloc
похож наmalloc
, но инициализирует выделенную память заданным значением (0). Память, выделенная с помощьюcalloc
, также нужно освобождать с помощьюfree
.new
инициализирует выделенную память, вызывая конструктор (если это объект). Память, выделенная с помощьюnew
, должна освобождаться с помощьюdelete
(который, в свою очередь, вызывает деструктор). Вам не нужно вручную указывать нужный размер и приводить его к соответствующему типу. Таким образом, это более современный и менее подверженный ошибкам подход.
Вы не нуждаетесь ни в чем, кроме new
. Он является полным заменителем malloc
в C++.
Что касается различий: malloc
просто выделяет память. new
выделяет память и вызывает конструкторы. Аналогично, free
просто освобождает память, тогда как delete
освобождает память и вызывает деструкторы.
Слово предостережения: не смешивайте эти два подхода. Результаты будут неопределёнными.
Использование оператора new
означает, что конструкторы будут вызваны для только что выделенной памяти. Если объект, который выделяется, не имеет конструкторов, то new
по сути эквивалентен вызову malloc
, и его обычно следует использовать вместо malloc
.
Стоит отметить, что new
может быть реализован как обертка над malloc
, а может и не быть таковым — стандарт C++ не требует какого-либо конкретного подхода.
Основное различие между new
и malloc
, которое я могу вспомнить, заключается в том, что память, выделенная с помощью new
, нельзя переопределить с помощью realloc
. Если вам нужно увеличить или уменьшить размер блока памяти, вам придется выделить новый блок и скопировать все содержимое в него.
Также стоит отметить, что calloc
позволяет инициализировать выделяемый блок памяти, в то время как malloc
этого не делает.
Когда вы создаете новый объект с помощью операции new, не только выделяется память для этого объекта, но также вызывается его конструктор. Это типичный способ работы в C++. В языке C для выделения памяти используется функция malloc, которая является более старым подходом. Функция calloc аналогична malloc, но, в отличие от нее, дополнительно обнуляет выделенную память, устанавливая все биты в ноль.
В каких случаях использовать malloc и/или new?
Можно ли получить доступ к памяти локальной переменной вне её области видимости?
Почему моя программа работает медленно при обходе ровно 8192 элементов?
Инициализация std::string из char* без копирования
Как удалить элемент из std::vector<> по индексу?