Sobes.tech
Junior — Middle

Τι συμβαίνει με την κλήση του καταστροφέα ενός αντικειμένου αν προκύψει εξαίρεση στον κατασκευαστή του;

sobes.tech AI

Απάντηση από AI

Αν προκύψει εξαίρεση στον κατασκευαστή ενός αντικειμένου σε C++, ο κατασκευαστής αυτού του αντικειμένου δεν καλείται, επειδή το αντικείμενο θεωρείται ότι δεν έχει δημιουργηθεί πλήρως.

Ωστόσο, οι κατασκευαστές των μελών του αντικειμένου και των βασικών κλάσεων που έχουν ήδη δημιουργηθεί πλήρως και έχουν κατασκευαστεί με επιτυχία πριν από την εμφάνιση της εξαίρεσης, θα κληθούν για την σωστή απελευθέρωση των πόρων.

Παράδειγμα:

class A {
public:
    A() { throw std::runtime_error("Σφάλμα στον κατασκευαστή"); }
    ~A() { std::cout << "Κατασκευαστής A" << std::endl; }
};

class B {
    A a;
public:
    B() { }
    ~B() { std::cout << "Κατασκευαστής B" << std::endl; }
};

int main() {
    try {
        B b; // κατά τη δημιουργία του a στο B() θα ριχτεί εξαίρεση
    } catch (...) {
        std::cout << "Εξαίρεση πιάστηκε" << std::endl;
    }
}

Σε αυτό το παράδειγμα, ο κατασκευαστής του B δεν καλείται, επειδή το αντικείμενο B δεν έχει δημιουργηθεί πλήρως, αλλά ο κατασκευαστής του A θα καλείται αν το A έχει κατασκευαστεί με επιτυχία πριν από την εξαίρεση.