Destruktor

A Wikipédiából, a szabad enciklopédiából

A destruktor az objektumorientált programozásban (szokták objektumelvű programozásnak is nevezni) egy olyan tagfüggvény (metódus), amely automatikusan meghívódik, amikor az objektum megszűnik. Elsődleges célja az hogy felszabadítsuk az általa lefoglalt erőforrásokat illetve megszüntessük az őrá mutató referenciákat más objektumokban hogy később ne történhessen érvénytelen hivatkozás. A destruktorok használata kulcsfontosságú szerepet játszik az RAII (resource acquisition is initialization) koncepció megvalósításában.

Az olyan programozási nyelvekben, ahol automatikus szemétgyűjtő (garbage collection) mechanizmus van, nagyon nehéz determinisztikusan biztosítani a destruktor meghívását ezért ezekről általánosan azt tartják hogy nem alkalmasak az RAII megvalósítására. Ezekben a felszabadítást a megfelelő tagfüggvény explicit meghívásával lehet elérni (amelyet általában Dispose()-nak hívnak).

Példák[szerkesztés | forrásszöveg szerkesztése]

C++[szerkesztés | forrásszöveg szerkesztése]

A destruktornak ugyanaz a neve, mint az osztálynak, csak egy tilde ('~', azaz hullámvonal) karakterrel kezdődik. Ha az adott objektumot automatikus változóként hozták létre, akkor a destruktora akkor fog lefutni, amikor az kikerül a látókörből (angolul scope). Ha egy objektumot a new kulcsszóval hozunk létre, akkor a destruktor akkor fog meghívódni, amikor a delete kulcsszót alkalmazzuk egy olyan mutatón (angolul pointer), amely az objektumra mutat.[1]

Öröklődés alkalmazása esetén a virtuális destruktorok használata biztosítja azt, hogy a leszármazott osztályok destruktorai is megfelelően meghívódnak, ezért minden olyan osztálynak illik virtuális destruktort definiálnia amelyet arra terveznek, hogy örököljenek belőlük, még akkor is ha nem csinál semmit.

#include <iostream>
 
class Pelda
{
public:
    Pelda()
    {
        std::cout << ( void* )this << ": Pelda()" << std::endl;
    }
    ~Pelda()
    {
        std::cout << ( void* )this << ": ~Pelda()" << std::endl;
    }
};
 
int main()
{
    Pelda tomb[ 3 ];
}

Kimenete egy konkrét rendszeren egy futtatáskor (a kettőspont előtt az objektum virtuális címe olvasható):

0x7fffffffbeb0: Pelda()
0x7fffffffbeb1: Pelda()
0x7fffffffbeb2: Pelda()
0x7fffffffbeb2: ~Pelda()
0x7fffffffbeb1: ~Pelda()
0x7fffffffbeb0: ~Pelda()

Megjegyzés: A megszüntetés sorrendje a létrehozás sorrendjének a fordítottja, amely nem véletlen. Képzeljük el, hogy létrehozunk két objektumot úgy hogy a másodikban hivatkozást helyezünk el az elsőre (például egy mutatóval mutatunk rá). Ha a megszüntetés sorrendje nem lenne fordított, akkor egy instabil állapoton haladna keresztül a program látókörből való kilépéskor.

Lásd még[szerkesztés | forrásszöveg szerkesztése]

Források[szerkesztés | forrásszöveg szerkesztése]