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; // B()-ში a-ის შექმნისას გამოიწვევა გამონაკლისი
    } catch (...) {
        std::cout << "გამონაკლისი დაფიქსირდა" << std::endl;
    }
}

ამ მაგალითში, B-ის დესტრუქტორი არ გამოიძახება, რადგან B ობიექტი არ არის სრულად შექმნილი, მაგრამ A-ის დესტრუქტორი გამოიძახება, თუ A წარმატებით იქნა შექმნილი გამონაკლისის წინ.