Sobes.tech
Junior — Middle

Čo sa stane s volaním destruktora objektu, ak v jeho konštruktore vznikne výnimka?

sobes.tech AI

Odpoveď od AI

Ak v konštruktore objektu v C++ nastane výnimka, destruktor tohto objektu sa nevolá, pretože objekt sa považuje za nedokončený.

Avšak, destruktory už úplne vytvorených členov objektu a základných tried, ktoré boli úspešne konštruované pred výskytom výnimky, budú volané na správne uvoľnenie zdrojov.

Príklad:

class A {
public:
    A() { throw std::runtime_error("Chyba v konštruktore"); }
    ~A() { std::cout << "Destruktor A" << std::endl; }
};

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

int main() {
    try {
        B b; // pri vytváraní a v B() dôjde k výnimke
    } catch (...) {
        std::cout << "Výnimka zachytená" << std::endl;
    }
}

V tomto príklade sa destruktor B nevolá, pretože objekt B nebol úplne vytvorený, ale destruktor A sa zavolá, ak bol A úspešne vytvorený pred výnimkou.