CodeBlanks Logo Icon CodeBlanks

Bellek sızıntısı

  • C kursu
  • Orta seviye
  • Ders 9/116
  • 5 dk

Bellek sızıntısı kavramını ve nasıl önleneceğini öğrenirsin.

Bellek sızıntısı nedir?

Bir bellek sızıntısı (memory leak), ayrılan belleğin iade edilmeden erişilmez hale gelmesidir. İşaretçi kaybolur ama bellek hâlâ ayrılı durumdadır.

Örnek: int *arr = malloc(100 * sizeof(int)); arr = NULL;. Burada arr'a NULL atanınca orijinal adres kaybolur; ama 100 int'lik blok hâlâ ayrılır durumdadır ve artık free edilemez. Uzun ömürlü programlarda sızıntılar birikir ve bellek tükenir. Bu yüzden her malloc'a karşılık bir free olmalıdır; adresi kaybetmeden önce iade edin.

Sızıntıları önleme

Sızıntıları önlemenin altın ilkesi: her malloc'a karşılık bir free. Adresi kaybetmeden önce iade et. Karmaşık fonksiyonlarda her dönüş yolunu düşün.

Örnek: bir fonksiyon malloc yaptıktan sonra hata ile çıkıyorsa, dönüşten önce free çağırmalısın. valgrind gibi araçlar sızıntıları otomatik bulur; program çalıştırıldıktan sonra rapor verir. Erken dönüşlerde (early return) özellikle dikkatli ol; if (hata) return; yazmadan önce ayrılan belleği iade et.

Uygulama Sızıntısız diziyi topla ve yazdır

int *arr = malloc(3 * sizeof(int)); ile üç elemanlı dizi ayır. Elemanlara 10, 20, 30 ata. Toplamı bir int sum değişkeninde biriktir (bir for döngüsü ile). printf("%d\n", sum) ile yazdır. Belleği free(arr); ile iade et.

Başlangıç kodu

main.c
#include <stdio.h>
#include <stdlib.h>

// uc elemanli dizi ayir
// 10, 20, 30 ata
// for ile topla, yazdir ve free ile iade et

int main(void) {
    return 0;
}

Örnek çözüm

main.c
#include <stdio.h>
#include <stdlib.h>

int main(void) {
    int *arr = malloc(3 * sizeof(int));
    arr[0] = 10;
    arr[1] = 20;
    arr[2] = 30;
    int sum = 0;
    for (int i = 0; i < 3; i++) sum += arr[i];
    printf("%d\n", sum);
    free(arr);
    return 0;
}

Beklenen çıktı

60

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Sızıntıyı önlemek için ne eksik?

Soru
int *arr = malloc(5 * sizeof(int));
arr[0] = 10;
printf("%d\n", arr[0]);
____(arr);
Cevap
int *arr = malloc(5 * sizeof(int));
arr[0] = 10;
printf("%d\n", arr[0]);
free(arr);

Açıklama: free(arr) belleği iade eder; sızıntıyı önler.

2 Hangi durum bellek sızıntısına yol açar?

  • free(arr)'den sonra arr'yi kullanmak
  • realloc ile diziyi büyütmek
  • NULL işaretçiyi free etmek
  • malloc ile ayrılan adresi kaybetmek Doğru cevap

Açıklama: Malloc ile ayrılan adresi kaybetmek.

3 Sızıntı ve güvenli desenleri eşle

Kavram Anlamı
malloc sonrası free yok Sızıntıya yol açar
free(arr) çağrısı Güvenli desen
arr = NULL free'den önce Adres kaybı
valgrind aracı Sızıntı bulucu

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