Sobes.tech
Junior — Middle

Ce se întâmplă cu apelul destructorului unui obiect dacă în constructorul său apare o excepție?

sobes.tech AI

Răspuns de la AI

Dacă apare o excepție în constructorul unui obiect în C++, destructorul acelui obiect nu este apelat, deoarece obiectul este considerat a nu fi complet creat.

Cu toate acestea, destructorii membrilor obiectului și ai claselor de bază care au fost deja create cu succes înainte de apariția excepției vor fi apelați pentru eliberarea corectă a resurselor.

Exemplu:

class A {
public:
    A() { throw std::runtime_error("Eroare în constructor"); }
    ~A() { std::cout << "Destructor A" << std::endl; }
};

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

int main() {
    try {
        B b; // la crearea lui a în B() va fi aruncată o excepție
    } catch (...) {
        std::cout << "Excepție capturată" << std::endl;
    }
}

În acest exemplu, destructorul lui B nu va fi apelat, deoarece obiectul B nu a fost complet creat, dar destructorul lui A va fi apelat dacă A a fost construit cu succes înainte de excepție.