virtual destructor
- C++ kursu
- Orta seviye
- Ders 40/116
- 5 dk
Sanal destructor ile doğru temizlik öğrenirsin.
virtual destructor
Bir sınıfın sanal yıkıcısı (virtual destructor) olduğunda, taban işaretçi üzerinden delete yapıldığında türetilmiş sınıfın yıkıcısı da çalışır.
Örnek: Base* b = new Derived();. Eğer ~Base virtual değilse, delete b; yalnız Base yıkıcısını çağırır; Derived yıkıcısı atlanır. Bu, bellek sızıntısına ve tanımsız davranışa yol açar. Çözüm: virtual ~Base() { }. Yıkıcıyı virtual yapmak, polimorfik sınıflarda zorunludur.
Sanal yıkıcı gereği
Bir sınıfta en az bir virtual metot varsa, yıkıcının da virtual yapılması gerekir. Bu, polimorfik kullanımda doğru temizliği garanti eder.
Yıkıcı virtual olduğunda, delete en türetilmiş yıkıcıdan başlar ve yukarı doğru çağırır. Önce ~Derived, sonra ~Base çalışır. Her iki sınıfın kaynakları da serbest bırakılır. Bu, C++'ta polimorfik sınıf tasarımının temel bir gereğidir.
Uygulama Sanal yıkıcı ile doğru temizlik
Base sınıfı tanımla; virtual ~Base() gövdesi std::cout << "Base yok";. Derived sınıfı miras alıp ~Derived() override gövdesi std::cout << "Derived yok ";. main içinde Base* b = new Derived(); ve delete b; yaz.
Başlangıç kodu
#include <iostream>
// Base ve Derived sınıflarını tanımla
int main() {
// Base* ile Derived oluştur ve delete yap
return 0;
}Örnek çözüm
#include <iostream>
class Base {
public:
virtual ~Base() { std::cout << "Base yok"; }
};
class Derived : public Base {
public:
~Derived() override { std::cout << "Derived yok "; }
};
int main() {
Base* b = new Derived();
delete b;
return 0;
}Beklenen çıktı
Derived yok Base yok
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Sanal yıkıcı bildirimini tamamla
class Base { public: virtual ____() { } };
class Base { public: virtual ~Base() { } };
Açıklama: ~Base, yıkıcı adıdır; virtual ile sanal yapılır.
2 Sanal yıkıcı ne zaman gereklidir?
Base* b = new Derived();
delete b;- Yalnız tek sınıfta
- Taban işaretçiyle delete edildiğinde Doğru cevap
- Asla
- Yalnız yapı (struct) kullanınca
Açıklama: Taban işaretçiyle delete'te türetilmiş yıkıcı için sanal yıkıcı şart.
3 Bileşeni rolüne eşle
| Kavram | Anlamı |
|---|---|
virtual ~Base |
Sanal yıkıcı |
delete b |
Temizlik çağrısı |
~Derived |
Türetilmiş yıkıcı |
Base* |
Taban işaretçi |