PDA

Tam Sürümünü Görmek İçin : delete edilmeyenler....


Darkstar
18/11/2004, 19:13
Herkese merhaba,

Aşağıdaki örnekteki Base nesnesine pointer'ı bir fonksiton içinde oluşturdum. pb'yi delete etmeden çıktığımda destructor da hiçbir zaman çağırılmıyor. Bu örnekte oldugu gibi delete etmeden kullanımı bırakılan memory'lerin ne gibi zararları olabilir?

class Base
{
public:
~Base() { cout<<"destructor'da"; }
};


void afunction()
{
Base *pb = new Base();

//.........do some work..........

}


int main()
{
afunction();
return 0;
}


acehreli
18/11/2004, 22:04
Buna "kaynak sIzIntIsI" (resource leak) denir. Program her afunction cagrildiginda en azindan bir miktar bellek, duruma gore de baska kaynaklar kaybeder.

new ile ayrilan bellegin delete ile geri verilmesi gerekir. delete iki is yapar:

1) Bozucu islevi cagirir; boylece nesnenin kendisi icin ayirdigi kaynaklar geri verilirler. Ornegin ~Base islevi icinde bir oge nesne icin baska bir delete kullanimi oldugunu dusunun.

2) Nesnenin oturdugu bellek, baskalari kullanabilsin diye geri verilir

Eger afunction islevi bir dongu icinde cagriliyorsa, bilgisayar bellek kalmadigi icin oldukca kotu bir duruma dusebilir. Ornegin Linux, o sirada calisan baska programlari sonlandirmaya baslar.

Ali

acehreli
18/11/2004, 22:09
Sinifin adinin Base olmasi, onun bir ust sinif olarak kullanilacagina isaret ediyor:


class Derived : public Base
{
/* ... */

~Derived()
{
// onemli bazi isler
}
};


Eger oyleyse, ~Base islevinin virtual yapilmasi da gerekir:


class Base
{
/* ... */
virtual ~Base();
};


Yoksa bir Derived'in bir Base gostergesi ile silinmesi durumunda hata olusabilir:


Base * p = new Derived(/* ... */);
delete p; // ~Derived cagrilmaz!


Ali