Sobes.tech
Junior — Middle

Šta će se desiti sa pozivom destruktora objekta ako u njegovom konstruktoru dođe do izuzetka?

sobes.tech АИ

Одговор од АИ

Ako u konstruktoru objekta u C++ dođe do izuzetka, destruktor tog objekta neće biti pozvan, jer se objekat smatra nedovršeno kreiranim.

Međutim, destruktori već potpuno kreiranih članova objekta i osnovnih klasa, koji su uspešno konstruisani pre pojave izuzetka, biće pozvani radi pravilnog oslobađanja resursa.

Primer:

class A {
public:
    A() { throw std::runtime_error("Greška u konstruktoru"); }
    ~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; // prilikom kreiranja a u B() biće bačena izuzetka
    } catch (...) {
        std::cout << "Izuzetak uhvaćen" << std::endl;
    }
}

U ovom primeru, destruktor B neće biti pozvan, jer objekat B nije bio potpuno kreiran, ali će se pozvati destruktor A ako je A uspešno konstruisan pre izuzetka.