Mayıs 2009 | Sayı : 2
      C ile Hafıza Yönetimi Mayıs 2009 | Sayı : 2

Hafıza Yönetimi

C gibi düşük seviyeli dillerde RAM üzerinde kullandığınız alanlar C# ya da Java’da olduğu gibi bir “garbage collector” tarafından otomatik olarak serbest bırakılmaz. C’de “malloc(memory allocate)” gibi bir fonksiyon ile işletim sisteminden bir bellek alanı talep edip aldıktan sonra kod içerisinde bu alanı işletim sistemine iade etmez yani serbest bırakmaz iseniz o bellek alanı programınız sonlandırılana kadar RAM üzerinde yer kaplamaya devam eder ve başka programlar bu alanı kullanamaz.

Özellikle bazı oyun yazılımlarında “memory leak”’ler ile karşılaşabilirsiniz. Oyun ilk açıldığında 150 MB yer kaplamaktadır ama siz oynadıkça bu gigabytelar seviyesine gelir ve bir süre sonra hard diskin RAM gibi kullanılmasından dolayı deli gibi çalıştığını ve oyununuzun işkence seviyesinde yavaşladığını fark edersiniz. Bu sorun kod içerisinde, kullanıldıktan sonra serbest bırakılması unutulmuş ufacık bir hafıza parçasından kaynaklanmış olabilir.

Örnek olarak C dilinde bir telefon rehberi yapısı kuralım. En temel olarak bir isim ve bir telefon tutalım her kayıt için. Bu değişkenler birer string yani char * olsunlar.

Bu örnekte bir kaydın “isim” ve “telefon” adlı iki değişkeni var. Bu değişkenler “char*” tipinde tanımlanmış yani RAM’de bir bytelık karakter verisinin adresini gösteriyorlar.

İlk fonksyonumuz “yeni_kayit_olustur” fonksiyonudur. Bu fonksiyonun ilk satırında “malloc” fonksiyonu ile işletim sisteminden bir “kayit” yapısı boyutu kadar RAM’de yer ayırması istenir ve bu alanın adresi “yenikayit” değişkenine atanır. Bu andan itibaren RAM üzerinde bir kayıt yapımız var ama bu kaydın isim ve telefon değişkenlerinin gösterebilecekleri birer adres yok. Her kayıt için ayrıca “isim” ve “telefon” değişkenlerine bellekte alanlar atamalıyız. Bunun sebebi, bu değişkenlerin birer değer değil adresi depolamaları ve ilk tanımlandıklarında rastgele bir adresi göstermeleridir. Bu adreslere erişmemize de işletim sistemi izin vermeyeceği için onlara özel RAM’de bellek tahsisi yaptıktan sonra veri depolamak için kullanabiliriz. Verilerimiz RAM’de ayrılan bellek üzerinde olacaktır. Fonksiyonun ikinci satırında “yenikayit” adresinin gösterdiği yapının “isim” değişkeni için RAM’de 20 karakter uzunluğunda bir alan ayrılır ve bu alanın başlangıç adresi “isim” değişkenine atanır. Üçüncü satırda ise aynı işlem “telefon” değişkeni için yapılır ancak bu değişkene 11 karakter yer ayrılır. Dördüncü satırda ise “yenikayit” adresi fonksiyonun dönüş değeri olacak şekilde fonksiyon sonlandırılır.

İkinci fonksiyonumuz ise “kayit_sil” fonksiyonudur. Bu fonksiyonun birinci satırında parametre olarak alınan “silinecek_kayit” adresinin gösterdiği yapının “isim” adlı değişkenini serbest bırakıyoruz. “isim” değişkeni aslında bir adrestir ve belleğin bu adresini işletim sistemi bu işlemden sonra bizim kullanımımızdan çıkarıyor. Artık o adres başka programlar ya da yine “malloc” ile yer ayırırsak bizim programımız tarafından kullanılabilir. İkinci satırda da “telefon” değişkeni için birinci satırdaki işlem yapılır. Üçüncü satırda ise “silinecek_kayit” adresini serbest bırakırız. Bu adımın son olarak gerçekleştirilmesi çok önemlidir çünkü eğer en başta bu yapıyı silseydik sonrasında “isim” ve “telefon” adreslerine ulaşamazdık.

Eğer “kayit_sil” fonksiyonu ile kullandığımız bellek alanlarını serbest bırakmasaydık RAM üzerinde her kayıt için 39 byte ziyan etmiş olacaktık. Milyonlarca ya da daha fazla kayıt ile uğraşacak isek bir süre sonra bu açık bizim diğer işlemlerimizi etkileyebilir.

C++ dili ile nesneye yönelik olarak bu örneği gerçekleştirecek olursak:

 “kayit” class’ından bir nesne oluştururken (“new” fonksiyonu ile) önce “kayit()” fonksiyonu yani “constructor” çalıştırılır. Bir nesneyi silerken ise (“delete” fonksiyonu ile) “~kayit()” fonksiyonu yani “destructor” çağırılır.

 

İstisna

Exceptionlar(istisnalar) program çalışırken hata üretme ya da bu hataları kontrol etme amacıyla kullanılırlar. C++ dilinde de diğer dillere benzer bir yapı vardır. Ama siz kendinize özel bir “Exception” yapısı oluşturmak isterseniz ne yapmalısınız?

Bu örnekte olduğu gibi kendi hatalarınızı oluşturup onları kontrol edebilirsiniz. Bu örnekte bir “Exception” nesnesine “message” isimli bir string ekledik. Bu string bize hatanın ne olduğunu söyleyebilir. Ayrıca bir “Exception” nesnesine her türlü değişken ya da farklı nesneler de ekleyebiliriz.

      Mustafa Burak AMASYALI
İ.Ü. Bilgisayar Mühendisliği 3. Sınıf
- Mayıs 2009 -
Editörden... | Muhammed CÜCE Bilgisayarlar ve Biz | Ilir ÇOLLAKU Bulanık Mantık | Sümeyra HAŞLAMAN C ile Hafıza Yönetimi | Mustafa Burak AMASYALI Sanal Kozalar | Neslişah ÇELİK Welcome to the Human Network | Ömer GENÇAY Neyi Nasıl Kullanıyoruz? | Erman TEPE PHP Dilinin Olmazsa Olmazları | Soner GÖNÜL HTML Tagları ve İncelikleri | Muhammed CÜCE Robotlarda Hareket Algoritmaları | Burhan ARAS Süper Bilgisayarlar | Ilgın UĞUR PGP ile E-mail, Dosya veya HDD Şifreleme | Şeyma İZMİR - Okan SÜRÜCÜ - Feyza ŞAHBUDAK
« önceki sayfa - 3 - sonraki sayfa »

Ana Sayfa | Künye | Dergimiz | | İletişim
© 2009-2010 Bilisimdergi.Com Tasarım - Kodlama : İU BİLGİSAYAR

Creative Commons License
Bilişim Dergi içeriği  Creative Commons  lisansı ile korunmaktadır.
Kaynak göstermek ve link vermek şartıyla yazılarımızı kullanabilirsiniz.