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
#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
#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?
int *arr = malloc(5 * sizeof(int));
arr[0] = 10;
printf("%d\n", arr[0]);
____(arr);
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 |