Dangling pointer
- C kursu
- Orta seviye
- Ders 10/116
- 5 dk
Dangling pointer kavramını ve güvenliği öğrenirsin.
Dangling pointer nedir?
Bir dangling pointer (askıda işaretçi), serbest bırakılmış belleğe hâlâ işaret eden işaretçidir. free(p)'den sonra p'nin değeri değişmez; eski adresi tutar.
Örnek: int *p = malloc(sizeof(int)); *p = 42; free(p); *p = 99;. Burada free'den sonra *p ataması tanımsız davranış (undefined behavior) oluşturur. Bellek artık sana ait değildir; başka bir ayırma için kullanılabilir. Bu tür hatalar çoğu zaman hemen çökmez; bu yüzden sinsidir. valgrind bunları Invalid write olarak raporlar.
free'den sonra NULL ata
Dangling pointer riskini azaltmanın basit ilkesi: free(p); p = NULL;. Adresi NULL yaptıktan sonra yanlışlıkla *p kullanırsan program çöker; bu, sessiz bozulmadan iyidir.
Örnek: free(arr); arr = NULL;. Artık if (arr != NULL) kontrolü ile belleğin geçerli olup olmadığını anlarsın. NULL işaretçiye erişim tanımsız davranış olsa da, modern sistemlerde hemen çökme (segfault) yapar; bu da hatayı erken yakalamanı sağlar. Bu desen, özellikle uzun ömürlü ve paylaşımlı işaretçilerde standarttır.
Uygulama Güvenli free deseni
int *p = malloc(sizeof(int)); ile tek int ayır. *p = 42; ata ve printf("%d\n", *p) ile yazdır. free(p); ile iade et, ardından p = NULL; ata. if (p != NULL) kontrolü içine printf("hala gecerli\n") koy; bu yüzden ekrana "hala gecerli" yazılmamalı.
Başlangıç kodu
#include <stdio.h>
#include <stdlib.h>
// tek int ayir, 42 ata ve yazdir
// free ile iade et, p'yi NULL yap
// p NULL degilse yazdir
int main(void) {
return 0;
}Örnek çözüm
#include <stdio.h>
#include <stdlib.h>
int main(void) {
int *p = malloc(sizeof(int));
*p = 42;
printf("%d\n", *p);
free(p);
p = NULL;
if (p != NULL) printf("hala gecerli\n");
return 0;
}Beklenen çıktı
42
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 free(p) çağrısından sonra p'nin değeri ne olur?
- Eski adresi hâlâ tutar Doğru cevap
- Silinir
- 0 olur
- NULL olur
Açıklama: free p'yi NULL yapmaz; bu yüzden dangling pointer oluşur.
2 Dangling ve güvenli desenleri eşle
| Kavram | Anlamı |
|---|---|
free(p); *p = 5; |
Dangling |
free(p); p = NULL; |
Güvenli |
if (p) *p = 5; |
Korunmuş |
free(NULL) |
Geçerli (no-op) |
3 free'den sonra NULL ata
int *p = malloc(sizeof(int));
*p = 42;
free(p);
p = ____;
int *p = malloc(sizeof(int));
*p = 42;
free(p);
p = NULL;
Açıklama: NULL atama dangling pointer riskini azaltır.