C dilinde değişkenler için bellek, ya yığın (stack) ya da heap ile ayrılabilir.
malloc, calloc, realloc ile ayrılır ve free ile manuel olarak serbest bırakılır. Bellek miktarı sistemin imkanları ile sınırlıdır, ancak erişim daha yavaştır ve serbest bırakma manuel olarak kontrol edilir.Yığın ne zaman kullanılmalı:
Heap ne zaman kullanılmalı:
// Yığında int arr[10]; // Heap'te int* parr = malloc(sizeof(int) * 10); // Bellek serbest bırakmayı unutmayın free(parr);
Soru: malloc ile ayrılan bir diziye free fonksiyonu çağrılmazsa ne olur?
Cevap: Bellek sızıntısı (memory leak) olur. Dinamik olarak ayrılan bellek otomatik olarak serbest bırakılmaz ve zamanla bu, uygulamanın bellek tükenmesine veya tüm sistemin bellek tükenmesine yol açabilir.
void leak() { int* leakArr = malloc(100 * sizeof(int)); // free(leakArr) çağrılmadı, bellek kaybolur }
Hikaye
Bir projede programcılar, oturumun tanımlandığı yapı için bellek ayırıp malloc ile free çağrısı yapmayı unuttular. Sonuç olarak, proje birkaç gün boyunca bellek kaybetti ve sunucu "yetersiz bellek" hatası ile çöküyordu. Sorun, Valgrind ile profil çıkarma yapıldıktan sonra tüm eksik free'ler düzeltildikten sonra çözüldü.
Hikaye
Bir geliştirici, geçici hesaplamalar için yığında büyük bir dizi (10 MB'a kadar) ayırdı. Küçük yığın boyutuna sahip bir sunucuda bu, uygulamanın stack overflow hatası ile çökmesine yol açıyordu. Analiz yapıldıktan sonra tampon heap'e taşındı.
Hikaye
Geliştiricilerden biri uzun dizeleri yığında saklamaya karar verdi, ancak dize boyutu kullanıcı tarafından belirleniyordu. Çok uzun bir dize girildiğinde, uygulama bellek erişim hatası ile çöküyordu. Sonuç olarak, girilen verilerin uzunluğunu kontrol ederek heap'e taşınması kararlaştırıldı.