malloc() выделяет сырую память в куче без вызова логики инициализации. new выделяет память и автоматически вызывает конструктор объекта, чтобы правильно его инициализировать.
Например:
string *ptr = (string *)(malloc(sizeof(string))); // Конструктор НЕ вызывается
string *ptr = new string; // Конструктор вызывается
malloc/free не поддерживают семантику объектов и не обеспечивают типобезопасность. Они требуют явного приведения типов и заставляют вручную считать размеры объектов, что чревато ошибками.
new/delete предоставляют:
new вызывает конструктор сразу после выделения памяти, обеспечивая правильную инициализацию объекта.
delete выполняет двухэтапный процесс:
Это критично для объектов, которые управляют ресурсами (файлы, память, подключения к БД и т. д.).
При выделении массивов нужно использовать согласованный метод:
Int_t *my_ints = new Int_t[10];
delete []my_ints; // Пустые скобки обязательны для массивов
Использование delete без скобок на памяти, выделенной для массива, вызывает неопределённое поведение.
new/delete можно перегружать в классе для кастомного управления памятью, в то время как malloc/free нельзя кастомизировать для конкретного класса.
В современном C++ предпочитай new/delete (или ещё лучше используй умные указатели типа std::unique_ptr и std::shared_ptr) для типобезопасности, автоматического управления ресурсами и правильного контроля жизненного цикла объектов.
Функция malloc() автоматически вызывает конструктор объекта после выделения памяти, в то время как new требует ручного вызова конструктора программистом.
Новый — ещё не проверен сообществом
Вы