Поведение delete при исключении в конструкторе объекта

Строка delete ptr не выполнится, потому что new Data выбросит исключение. При обычном new память под сам недостроенный объект автоматически освобождается, поэтому именно этот блок не утечёт.

Короткий ответ

Что ответить на собеседовании

Строка delete ptr не выполнится, потому что new Data выбросит исключение. При обычном new память под сам недостроенный объект автоматически освобождается, поэтому именно этот блок не утечёт.

Подробный разбор

Ответ с пояснениями

Условие

Как будет вести себя программа, если конструктор бросит исключение? Будет ли выполнен оператор delete и возникнет ли утечка памяти?

#include <iostream>

struct Data {
    Data() {
        throw std::runtime_error("exception");
    }
};

int main(int argc, char** argv) {
    try {
        Data* ptr = new Data;
        delete ptr;
    } catch (const std::exception& e) {}
    
    return EXIT_SUCCESS;
}

Ответ

Строка delete ptr не выполнится, потому что new Data выбросит исключение. При обычном new память под сам недостроенный объект автоматически освобождается, поэтому именно этот блок не утечёт.

Уже созданные поля и базовые части уничтожаются, но деструктор самого Data не вызывается: конструирование не завершилось. Для std::runtime_error нужно явно подключить .

Автоматическая очистка памяти объекта не освобождает любые сырые ресурсы, которые конструктор успел отдельно получить. Такие ресурсы нужно сразу помещать в RAII-объекты. Правила для пользовательского placement new и нестандартных функций размещения рассматриваются отдельно.

Источник: eel.is.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее