ProgramlamaC geliştirici

C dilinde dinamik bellek tahsisi ve serbest bırakma mekanizmasını, temel fonksiyonları (malloc, calloc, realloc, free) ve bunların kullanımındaki yaygın hataları açıklayın.

Hintsage yapay zeka asistanı ile mülakatları geçin

Cevap

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.

Dolaylı Soru

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.

Konunun inceliklerinden dolayı yaşanan gerçek hata örnekleri


Hikaye

Bir otomasyon test sistemi projesinde düzenli olarak çökme yaşandı. Suçlu, her geçişten sonra malloc ile 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 realloc kullanarak 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 free ile 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).