İleri Seviye C Progrmlama – Dinamik Bellek Yönetimi

Dinamik Bellek Yönetimi, C Programlama Dilinde önem derecesi en yüksek konulardan biridir. Bu kadar önemli olmasının sebebi kuşkusuz sınırsız belleğimizin olmamasıdır. Burada temel amaç belleği verimli kullanabilmektir. Eğer bellek yönetimini iyi yapamıyorsak daha fazla belleğe ihtiyaç duyarız. Daha fazla belleğe ihtiyaç duymak belli başlı birkaç sorunu beraberinde getirir. Örneğin yazdığımız programın yavaş çalışması. Yavaş çalışan ve gereğinden fazla bellek tüketen bir programı kullanmak istemeteyiz herhalde.

Dinamik bellek yönetiminin bir başka yararından bahsedecek olursak, bir dizi tanımlarken 

char isim[20];

gibi bir ifade kullandığımızda derleyici(compiler)  bellekten 20 byte boyutunda bir alan ayıracaktır. Bu alan ayırma işlemi program başlatılmadan önce yapılmaktadır. Yani programın akışı içerisinde bu dizinin boyutunu değiştirmeniz mümkün değildir. Hâlbuki yeri geldiğinde bellekten boyutu sabit olmayan ve sürekli değişebilen alanlar almamız gerekecek. Örnek vermek gerekirse : bir kütüphaneye gelen öğrencilerin listesini tutmak için bellekten ayıracağımız alanın boyutunu önceden tahmin edebilir miyiz? Tahmin edemeyeceğiniz için her öğrenci geldiğinde bellekte ayırdığınız alanı büyüterek belleği en verimli şekilde kullanabiliriz. Yani dinamik bellek yönetimi ile programın çalışma zamanı sırasında işletim sistemine danışarak sürekli olarak bellek bölgeleri ayırabiliriz.

Heap Memory

Dinamik bellek fonksiyonları tarafından tahsis edilme potansiyelindeki alanlara heap denir. Heap alanı da çalıştırılabilen dosyada yer kaplamaz, prosese özgü bir biçimde prosesin adres alanı içerisinde yaratılır. Heap alanının prosesin adres alanı içerisinde nerede ve ne kadar uzunlukta yaratılcağı sistemden sisteme değişebilmektedir. Genellikle sistemler prosesin adres alanında başka amaçla kullanılmayan tüm boş yerleri potansiyel bir heap alanı olarak belirlemektedir.

Dinamik Bellek Yönetimi Fonksiyonları

  • Malloc
  • Calloc
  • Realloc
  • Free

fonksiyonları en çok kullanılan dinamik bellek yönetimi fonksiyonlarıdır.

Malloc() [memory allocation]

Belirli boyuttaki hafıza kalıbını ayırır ve size belirlediğiniz tipde bir pointer döndürür.

Syntax yapısı:

 ptr = (cast-type*) malloc(byte-size);

Calloc() [contiguous allocation]

Malloc fonksiyonuna çok benzer. Malloc fonsiyonun aksine hepsi aynı boyutta ve sıfırlanmış çoklu memory grupları şeklinde yer ayırır.

Syntax yapısı:

ptr = (cast-type*)calloc(n, element-size);

Realloc()

Ayrılan memory alanını yeniden düzenlemeye yarıyan fonksiyondur.

Syntax yapısı:

ptr = realloc(ptr, newsize);

free()

Alınan memory gruplarını sisteme geri veren fonksiyondur.

Syntax yapısı:

free(ptr);

Konuyla ilgili kod örneklerini görmek için tıklayın.