05.20.2009

İşaretçiler(pointer), C++ dünyasına aslında C’den gelen bir kavram. C’ye de assembler’dan gelmişti. C++ programlarında pekçok hata bir kenarından işaretçiler ile ilgili oluyor. İşaretçilerle yapılan aritmetik işlemler, işaretçilerin sıfırlanmasının unutulması vs.

Yine C++ programlarında en sık yapılan hatalardan biri de bellek yönetimi hataları. Sistemden alınan ve iş bittikten sonra geri verilmeyen bellek, veya geri verilmiş belleğe bakmaya devam eden işaretçileri kullanmak vs.

İşte bu iki genel hata grubunun kesişiminde bulunan önemli bir bölümünü çözmek için akıllı işaretçiler (smart pointer) geliştirilmiş.

Pekçok farklı, akıllı işaretçi kütüphanesi geliştirilmiş olsa da, bellek yönetimi için şu an standart kullanmanız gereken akıllı işaretçiler STL ve boost içinde yer alanlar (ki boost içinde yer alanlar önümüzdeki yıllarda STL içine eklenecek).

Akıllı işaretçiler, bildiğimiz normal işaretçiler gibi görünüp kullanılabilen, ama belli koşullarda işaret ettikleri nesne üzerinde delete komutunu çağırıp, sisteme geri verilmesini sağlayan (yani akıllı) sınıflardır (aslında sınıf değil birer şablondurlar(template) ama kafanız karışmasın).

Basitten karmaşığa doğru elimizdeki seçenekler

  1. boost::scoped_ptr<>
  2. std::auto_ptr<>
  3. boost::shared_ptr<> ve boost::weak_ptr<>

Normalde bu üç işaretçi tipini doğru şekilde kullanırsanız, programınızın hiçbir yerinde delete komutunu kullanmanıza gerek kalmamalı. Yani hiçbir şeyi açıkça siz delete etmeden ve hiç bellek sızdırmadan C++ programı yazmak mümkün.

Aklınıza eğer akıllı işaretçiler ile ilgili performans kaygıları geliyorsa, hemen bu kaygılarınızdan sıyrılmak için boost.org’daki akıllı işaretçi performans analizi yazılarını okuyabilirsiniz. Göreceksiniz ki pekçok durumda hiç kaygılanmanıza gerek yok (hatta Herb Sutter der ki, bir programı profiler araçlarından geçirip neresinin performans bakımından zayıf halka olduğunu tespit etmeden, böyle gaipten kaygılar duymamak lazımdır). Kısacası anafikir, gerek STL gere boost içindeki akıllı işaretçiler son derece optimize edilmiş ve son derece iyi test edilmiş kod parçalarıdır. Bunlar hakkında performans kaygısı gütmek için, gerçekten neden bahsettiğini çok iyi biliyor olmak lazım :)

Neyse bir sonraki yazıda scoped_ptr’den bahsedeceğim.

Share

Comments

  1. Emir Akaydın on 05.21.2009

    Boost hiç kullanmadım ancak STL kullandığım zaman bu konuyu incelemiştim. Gel gör ki yeni projelerimde C++/CLI kullanıyorum. Artık resmen normal pointer kullanmayı unuttum, hep .NET objelerine ait managed pointerları (^) kullanıyorum. Öyle bir durum var ki managed pointerlar bu söz konusu akıllı pointerlar ile benzerlikler, hatta bazı ek özellikler içeriyor. Yani bunlara bir alternatif de .NET’in içersinde geliyor. Ancak .NET kullanmadan geliştirilen, özellikle de multiplatform projeler için güzel bir çözüm. Örneğin Pandora için geliştirmeyi planladığım projelerde kullanmayı çok isterim.

  2. Nightlord on 05.21.2009

    evet emir. Akilli isaretciler C++ da, .NET ve Java gibi cop toplama (garbage collection) ozelligi olan dillerin icinde gelen bellek yonetim ozelligini emule etmeye calisiyor. Native C++ performansina ihtiyac duyulan ve dolayisiyla garbage collection’in yavas kalacagi durumlarda siddetle tavsiye ederim. cok sevecegine eminim :)

  3. ugur salih on 01.29.2014

    keşke c# eğitimi de verseydin tebrik ederim çok açıklayıcı

Leave a Reply