Virtuális destructor - verem túlcsordulás az orosz

Volt egy kérdés a virtuális destruktor.

Ahogy én látom - egy virtuális destruktor kell örökölni osztály, amelyben van (a bázis) okozhat (egyenesen) dekonstruktorának bázis, valamint egyszerű destructor örökölt osztály nem érti, akkor meg kell, hogy hozzon létre egy virtuális.

És mindez, hogy nincs memóriavesztés.

Így már értem a lényeget?

Nem egy kicsit rossz. A dekonstruktorának az alap osztály destructor származékot okoznak nem kell (és nem), akkor indít önmagát automatikusan. Van egy másik probléma: a származtatott osztály destruktor nem nevezhető!

Képzeld el ezt a helyzetet:

Mi történik, ha a lista egy Spy. Íme: az a tulajdon megsemmisülése típusú pointer típusú Spy Person * lesz az úgynevezett non-virtuális destruktor

Személy. Ez azt jelenti, hogy a memória egy sor szerkentyű nem kell szabadítani. Itt van egy memória szivárgás.

Tény, hogy minden más baj, mert a destruktor is előfordulhat mellett a memóriavesztés, amit várt, nem hívja! Például a fájlt nem lehet zárt, és a következő alkalommal, amikor megpróbálja megnyitni a program kerül ki. Vagy nem szabadul a mutex, és ha megpróbál majd beletanul programot. Van még egy csomó minden balesetek előfordulhatnak.

Tovább ront a helyzeten, a nem szabványos virtuális destruktor ebben az esetben nem definiált viselkedés, azaz a program lehetővé tette, hogy semmit: formázni a merevlemezt, egy szerelmi vallomás a vegyész keresztül „Vkontakte” vagy macskagyökér öntsük egy tálba a Whiskas.

Igen, mint a C destruktorok nincs egyáltalán.

Hozzá egy nagyon jó felhasználói VladD magyarázza a következő kódot, amely gyakran megtalálható mindenütt:

teljesítmény lesz az eredmény:

Ügyeljen arra, hogy a sorrendben a hívások konstruktorok és a destruktor. A destruktor nevezik fordított sorrendben a kivitelező hívásokat. Most távolítsa el a virtuális kulcsszót

Derive (). ennek következtében Vezessük osztály destruktor nem nevezhető:

Ha a bázis osztály a tervek szerint továbbra is öröklik másik osztályba destructor kell lennie virtuális. Azt javasoljuk, olvassa el Scott Meyers, az ő kiváló könyv a C ++.

Kapcsolódó cikkek