8. szabály nem teszi lehetővé kivételeket elhagyni destruktorok - hatékony felhasználása c
> // v automatikusan megsemmisül
Ha a v vektor megsemmisül, ő a felelős a megsemmisítését tárgyak Widget, amely tartalmaz. Tegyük fel, hogy v tartalmaz 10 tárgyat Widget, és a megsemmisítés a korábbi vozbuzhaetsya kivétel. A többi kilenc létesítmények Widget is meg kell semmisíteni (különben a részükre juttatott forrásokat fog veszni), így meg kell hívni a destruktor. De elképzelhető, hogy abban az időben a második tárgy destruktor Widget is emelni fogja kivétel. Aztán ott lesz csak két egyidejűleg aktív kivételek, de ez túl sok C ++. Attól függően, hogy az adott körülmények között a program végrehajtása vagy megszakad, vagy az ő viselkedése nem definiált. Ebben a példában csak a második esetben. És ez akkor fordul elő, ha bármilyen a könyvtár tartály (például lista, beállítva), minden olyan tartály TR1 (lásd. 54.), és a páros tömb. És az oka ez a probléma nem történt konténerekben vagy tömböket. Idő előtti programok megszüntetése vagy meghatározatlan viselkedés itt az eredménye, hogy a destruktor egy kivételt. C ++ nem szereti destruktorok kivételt dob!
Elég könnyű megérteni. De mit tegyünk akkor, ha a destruktor kell végrehajtani egy műveletet, amely képes generálni kivétel? Tegyük fel például, hogy van dolgunk egy osztály, a kapcsolat az adatbázishoz:
statikus DBConnection létre (); // függvény egy tárgyat
// DBConnection; paraméterek
void close (); // lezárja a kapcsolatot; a kudarc
Annak érdekében, hogy az ügyfél nem felejtsük el, hogy hívja közel DBConnection tárgyak, célszerű létrehozni egy osztály kezeli a forrásokat DBConnection, ami közel annak destruktor. Osztályok, erőforrás menedzserek, úgy véljük, részletesen a 3. fejezetben, de itt elég kitalálni, hogy hogyan néz ki dekonstruktorának ebbe az osztályba:
osztály DBConn / Класс для управления объектами
DBConn () // annak biztosítására, hogy az adatbázis kapcsolat