C dilinde dinamik bellek yönetimi için stdlib.h kütüphanesindeki fonksiyonlar kullanılır:
malloc(size_t size) — belirtilen boyutta bir bellek bloğu ayırır. Bellek initialize edilmez.calloc(size_t nmemb, size_t size) — nmemb elemanlı bir dizi için belirtilen boyutta bir bellek bloğu ayırır ve sıfırlarla initialize eder.realloc(void *ptr, size_t size) — daha önce ayrılmış bellek bloğunun boyutunu değiştirir.free(void *ptr) — daha önce ayrılmış bloğu serbest bırakır.Kullanım örneği:
int *arr = (int *)malloc(10 * sizeof(int)); if (arr == NULL) { // Bellek tahsisi hatası ile başa çıkma } // ... arr ile çalışma ... free(arr);
Her zaman bellek tahsisi sonucunu NULL ile kontrol etmek ve bellek kaçaklarını önlemek için free çağrısını unutmayın.
Aşağıdaki kodun sonucu ne olur?
int *arr = malloc(sizeof(int) * 5); free(arr); free(arr);
Cevap: Aynı bellek alanı için tekrar free çağrısı yapmak tanımsız davranışa yol açar (undefined behavior). Aynı işaretçiyi yalnızca bir kez serbest bırakmak mümkündür.
Hikaye
Bir otomasyon test sistemi projesinde düzenli olarak çökme yaşandı. Suçlu, her geçişten sonra
mallocile tahsis edilen belleği serbest bırakmayı unutan sistem döngüsüydü. Uzun testler sonucunda sistem "tüm RAM'i yedi" ve donmuştu.
Hikaye
Dinamik dizinin implementasyonu
reallockullanarak sonucu kontrol etmeden çalışıyordu. Başarısızlık durumunda (realloc NULL döndüğünde) eski bellek göstericisini kaybediyorduk ve bellek sızıntısına neden oluyordu. Bellekle çalışmaya devam etmek segfault'a yol açıyordu.
Hikaye
Bir geliştirici, bellek
freeile ardışık iki kez serbest bırakılan bir eski C modülünü entegre etti. Çoğu işletim sisteminde hata çıkmadı, ancak yeni platformda uygulama çökmesine neden oldu, sebep uzun bir süre sonra bulundu: çift serbest bırakma (double-free).