ПредишенСледващото

> // о е унищожена автоматично

Когато вектор V е унищожен, той е отговорен за унищожаването на всички обекти Widget, който тя съдържа. Да предположим, че срещу съдържа 10 обекти Widget, и в унищожаването на бившия vozbuzhaetsya изключение. Останалите девет съоръжения Widget също трябва да бъдат унищожени (в противен случай средствата, отпуснати за тях, ще бъдат загубени), така че трябва да се обадя на техните деструктори. Но представете си, че по време на втория обект деструктор Widget също ще предизвика изключение. Тогава няма да има само две едновременно активни изключения, но това е твърде много за C ++. В зависимост от конкретните условия на изпълнение на програмата, или да бъде прекъснат или поведението й ще се определи. В този пример, просто втория случай. И това ще се случи, когато се използва някоя от контейнера за библиотека (например списък, определен), всеки контейнер TR1 (вж. 54), а дори и масив. И причината за този проблем не е в контейнери или масиви. Преждевременно прекратяване програма или неопределен поведение тук е резултат от факта, че деструктори предизвика изключение. C ++ не харесва деструктори хвърля изключение!

Това е достатъчно лесно да се разбере. Но това, което трябва да направите, ако вашата деструктор е необходимо да се направи операция, която може да генерира изключение? Например, да предположим, че си имаме работа с един клас, връзката с базата данни:

статичен DBConnection създаде (); // връща обект

// DBConnection; параметри за

невалидни близо (); // затвори връзката; на неуспех

За да се гарантира, че клиентът не забравяйте да се обадите в близост до DBConnection обекти, разумно е да се създаде клас за управление DBConnection на ресурси, което е близо в своя деструктор. Курсове, мениджъри на ресурси, които смятаме подробно в глава 3, но тук доста разбера как да изглежда деструктор на този клас:

клас DBConn

DBConn () // за да гарантират, че свързването към базата данни

Подкрепете проекта - споделете линка, благодаря!