destructor (tsz. destructors)
A destruktor (~Destructor
) egy speciális tagfüggvény C++-ban, amely automatikusan meghívódik, amikor egy objektum megszűnik. Ez különösen fontos dinamikusan foglalt memória felszabadításához és más erőforrások megfelelő kezeléséhez.
A destruktor egy olyan függvény, amely egy objektum élettartamának végén fut le. Célja, hogy felszabadítsa azokat az erőforrásokat, amelyeket az objektum használ (például dinamikusan foglalt memória, fájlok, hálózati kapcsolatok stb.).
Fontos tulajdonságai: - Neve megegyezik az osztály nevével, de előtte egy ~
jel áll. - Nincs visszatérési értéke és nem fogad paramétereket. - Automatikusan meghívódik, amikor az objektum elpusztul (például kilép a hatóköréből vagy delete
-tel töröljük).
#include <iostream>
using namespace std;
class Teszt {
public:
Teszt() {
cout << "Konstruktor meghívva." << endl;
}
~Teszt() { // Destruktor
cout << "Destruktor meghívva." << endl;
}
};
int main() {
Teszt obj; // Objektum létrejön → Konstruktor lefut
cout << "Fő program fut." << endl;
return 0; // A program végén az obj megszűnik → Destruktor lefut
}
Konstruktor meghívva. Fő program fut. Destruktor meghívva.
Mi történik itt? - Az obj
létrejön, a konstruktor fut. - A fő program utasításai végrehajtódnak. - Az obj
változó hatókörön kívül kerül → Destruktor automatikusan meghívódik.
Ha az objektum new
operátorral dinamikusan foglal memóriát, akkor azt manuálisan kell felszabadítani a destruktorban.
#include <iostream>
using namespace std;
class Dinamikus {
private:
int* szam;
public:
Dinamikus() {
szam = new int; // Dinamikus memória foglalás
*szam = 42;
cout << "Konstruktor: Dinamikus változó létrehozva." << endl;
}
~Dinamikus() { // Destruktor
delete szam; // Memória felszabadítása
cout << "Destruktor: Dinamikus változó felszabadítva." << endl;
}
void mutat() {
cout << "Ertek: " << *szam << endl;
}
};
int main() {
Dinamikus obj;
obj.mutat();
return 0; // A destruktor automatikusan lefut
}
Konstruktor: Dinamikus változó létrehozva. Ertek: 42 Destruktor: Dinamikus változó felszabadítva.
Fontos:
- A konstruktor dinamikusan foglal egy egész számot (new int
). - A destruktor felszabadítja a memóriát (delete szam
), hogy elkerüljük a memória szivárgást (memory leak). - A program végén a destruktor automatikusan meghívódik.
Ha az osztály dinamikusan foglalt tömböt használ, akkor azt delete operátorral kell felszabadítani.
#include <iostream>
using namespace std;
class DinTomb {
private:
int* tomb;
int meret;
public:
DinTomb(int m) {
meret = m;
tomb = new int; // Dinamikus tömbfoglalás
for (int i = 0; i < meret; i++) {
tomb = i * 10;
}
cout << "Konstruktor: " << meret << " elemű tömb létrehozva." << endl;
}
~DinTomb() {
delete tomb; // Felszabadítás
cout << "Destruktor: Tömb felszabadítva." << endl;
}
void kiir() {
for (int i = 0; i < meret; i++) {
cout << tomb << " ";
}
cout << endl;
}
};
int main() {
DinTomb obj(5);
obj.kiir();
return 0;
}
Konstruktor: 5 elemű tömb létrehozva. 0 10 20 30 40 Destruktor: Tömb felszabadítva.
Fontos:
- A konstruktor dinamikusan foglal egy tömböt. - A destruktor felszabadítja a memóriát (delete tomb
).
Ha egy osztály más osztályból öröklődik, a destruktorokat fordított sorrendben hívja meg a rendszer.
#include <iostream>
using namespace std;
class Szulo {
public:
Szulo() { cout << "Szulo osztály konstruktora." << endl; }
~Szulo() { cout << "Szulo osztály destruktora." << endl; }
};
class Gyerek : public Szulo {
public:
Gyerek() { cout << "Gyerek osztály konstruktora." << endl; }
~Gyerek() { cout << "Gyerek osztály destruktora." << endl; }
};
int main() {
Gyerek obj;
return 0;
}
Szulo osztály konstruktora. Gyerek osztály konstruktora. Gyerek osztály destruktora. Szulo osztály destruktora.
Fontos:
- Először a szülő osztály konstruktora fut le, majd a gyerek osztály konstruktora. - Az objektum megszűnésekor előbb a gyerek destruktora fut le, majd a szülőé.
- Ez biztosítja, hogy az örökölt erőforrások megfelelő sorrendben legyenek felszabadítva.
✔ Ha az osztály dinamikusan foglal memóriát (new
használatával).
✔ Ha az osztály fájlokat nyit meg és azokat le kell zárni.
✔ Ha hálózati kapcsolatokat kezel és azokat le kell bontani.
✔ Ha adatbázis kapcsolatokat kell lezárni.
~OsztalyNev()
) automatikusan lefut, amikor egy objektum megszűnik.new
) esetén mindig használjunk destruktort (delete
vagy delete
).A destruktorok kulcsszerepet játszanak a hatékony memória- és erőforráskezelésben, ezért mindig ügyeljünk rá, hogy a destruktor megfelelően felszabadítsa a szükséges erőforrásokat. 🚀