Как работает оператор new в C++?

«Как работает оператор new в C++?» — вопрос из категории Управление памятью, который задают на 25% собеседований C/C++ Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Оператор new в C++ выполняет две ключевые операции:

  1. Выделение памяти: Вызывает функцию operator new, которая выделяет неинициализированную память достаточного размера из свободного хранилища (кучи). Этот оператор может быть перегружен глобально или для конкретного класса.
  2. Инициализация объекта: В выделенном блоке памяти вызывается конструктор объекта, который превращает сырую память в готовый объект.

Если выделение памяти не удаётся, по умолчанию генерируется исключение 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), которые управляют памятью автоматически.