CodeBlanks Logo Icon CodeBlanks

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

main.c
#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

main.c
#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

Soru
int *p = malloc(sizeof(int));
*p = 42;
free(p);
p = ____;
Cevap
int *p = malloc(sizeof(int));
*p = 42;
free(p);
p = NULL;

Açıklama: NULL atama dangling pointer riskini azaltır.

Orta seviye bölümündeki tüm dersler