Ответ
Оператор new в C++ выполняет две ключевые операции:
- Выделение памяти: Вызывает функцию
operator new, которая выделяет неинициализированную память достаточного размера из свободного хранилища (кучи). Этот оператор может быть перегружен глобально или для конкретного класса. - Инициализация объекта: В выделенном блоке памяти вызывается конструктор объекта, который превращает сырую память в готовый объект.
Если выделение памяти не удаётся, по умолчанию генерируется исключение std::bad_alloc. Можно использовать форму new (std::nothrow), чтобы вернуть nullptr вместо исключения.
Пример:
// Выделяет память под один int, вызывает конструктор (инициализирует значением 42).
int* p = new int(42);
// ... использование p
delete p; // Вызывает деструктор (для тривиальных типов - ничего) и освобождает память через operator delete.
Отличие от malloc: malloc только выделяет сырую память заданного размера и не вызывает конструкторы. Использование malloc для объектов в C++ небезопасно, так как объект остаётся неинициализированным.
Для массивов:
// Выделяет память под массив из 10 int, для нетривиальных типов вызывает конструктор по умолчанию для КАЖДОГО элемента.
int* arr = new int[10];
// ...
delete[] arr; // Для нетривиальных типов вызывает деструктор для каждого элемента, затем освобождает память.
Важно: Пары new/delete и new[]/delete[] должны использоваться строго соответствующим образом, иначе поведение не определено (UB). В современном C++ предпочтительнее использовать умные указатели (std::unique_ptr, std::shared_ptr) и контейнеры (std::vector), которые управляют памятью автоматически.