Какова разница между "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<> по индексу?