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-ն հաջողությամբ ստեղծվել է արտակարգ իրավիճակի առաջացմանց առաջ։