Şekil: Verilen program parçası için belleğin durumu.
- (a) a satırındaykenki durum.
- (b) b satırındaykenki durum.
- (c) c satırındaykenki durum.
class Node {int value;Node *next;};
...
Node *p = new Node();
Node *q = new Node();
Node *r = new Node();
p->next = q;q->next = r; // ar = NULL; // bdelete q; // c
Yukarıda verilen program parçasının a satırına kadar işletilmiş olduğunu düşünelim. Buna göre belleğin şu andaki durumu Şekil a’daki gibi olacaktır. Bu durumda tüm nesnelere programın bağlamındaki değişkenlerden (statik ya da yığındaki değişkenlerden) ulaşmak mümkündür.
B satırına gelindiğinde r değişkenine NULL atanarak r ile işaret ettiği nesne arasındaki bağlantı koparılır. Son olarak c satırında q’nun işaret ettiği nesnenin kapladığı alan bellek yöneticisine geri verilir.
Bu anda iki sorun ortaya çıkar:
-
Artık q’nun ve p->next’in işaret ettiği bellek bölgesi bellek yöneticisine geri verildiği için geçersizdir. Bu yüzden q’ya ve p->next’e geçersiz işaretçiler deriz.
-
Eskiden r’nin işaret ettiği nesneye artık bağlamdan ulaşmanın bir yolu kalmamıştır. Bu tür nesnelere çöp denir. Çöp nesnelerin bellekte gereksiz alan kaplamasına da bellek sızıntısı denir.