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