Назад к вопросам
Middle+
95
questionbank

Если в конструкторе будет вызвано исключение, будет ли вызван деструктор?

Sobes Copilot

Получайте ответы в реальном времени

Ответ от нейросети

sobes.tech AI

Нет, деструктор не будет вызван.

Если во время выполнения конструктора класса возникает исключение, объект считается не полностью сконструированным. В таком случае C++ не вызывает деструктор для этого частично созданного объекта. Вызываются деструкторы только для полностью сконструированных подобъектов (базовых классов или членов класса).

Пример:

#include <iostream>
#include <stdexcept>

class MyClass {
public:
    MyClass() {
        std::cout << "Конструктор MyClass" << std::endl;
        throw std::runtime_error("Ошибка в конструкторе");
    }

    ~MyClass() {
        std::cout << "Деструктор MyClass" << std::endl; // Этот код не будет выполнен
    }
};

int main() {
    try {
        MyClass obj; // Здесь будет брошено исключение
    } catch (const std::runtime_error& e) {
        std::cerr << "Поймано исключение: " << e.what() << std::endl;
    }
    return 0;
}

Вывод программы:

Конструктор MyClass
Поймано исключение: Ошибка в конструкторе

Деструктор ~MyClass() не вызывается.