Sobes.tech
Junior — Middle

O que acontece com a chamada do destruidor de um objeto se ocorrer uma exceção no seu construtor?

sobes.tech IA

Resposta da IA

Se ocorrer uma exceção no construtor de um objeto em C++, o destruidor desse objeto não é chamado, porque o objeto é considerado não totalmente criado.

No entanto, os destruidores dos membros do objeto e das classes base que já foram completamente criados e construídos com sucesso antes da ocorrência da exceção serão chamados para liberar recursos corretamente.

Exemplo:

class A {
public:
    A() { throw std::runtime_error("Erro no construtor"); }
    ~A() { std::cout << "Destruidor A" << std::endl; }
};

class B {
    A a;
public:
    B() { }
    ~B() { std::cout << "Destruidor B" << std::endl; }
};

int main() {
    try {
        B b; // ao criar a em B() será lançada uma exceção
    } catch (...) {
        std::cout << "Exceção capturada" << std::endl;
    }
}

Neste exemplo, o destruidor de B não será chamado, pois o objeto B não foi totalmente criado, mas o destruidor de A será chamado se A foi construído com sucesso antes da exceção.