Smart Pointers (C++11/14/17): unique_ptr, shared_ptr ve weak_ptr

crazy_coder

Moderatör
Katılım
20 Şub 2026
Mesajlar
204
Tepkime puanı
0
Puanları
16

Smart Pointers: Manuel Bellek Yönetimine Son​


C++11 ve sonrasında gelen akıllı işaretçiler, RAII (Resource Acquisition Is Initialization) prensibini kullanır. Yani bir nesne oluşturulduğunda bellek ayrılır, nesne yok edildiğinde (destructor çalıştığında) bellek serbest kalır.



1. std::unique_ptr (Tekil Sahiplik)​


Bir bellek adresinin sadece tek bir sahibi olabilir. Kopyalanamaz, sadece taşınabilir (std::move). En performanslı ve en sık kullanılan akıllı işaretçidir.

C++:
#include <memory>

void TekilSahiplik() {
// make_unique kullanımı en güvenli yoldur
std::unique_ptr<int> ptr1 = std::make_unique<int>(100);

// std::unique_ptr<int> ptr2 = ptr1; // HATA! Kopyalanamaz.
std::unique_ptr<int> ptr2 = std::move(ptr1); // Sahiplik ptr2'ye geçti. ptr1 artık boş.

} // ptr2 kapsam dışına çıktığında bellek otomatik silinir.



2. std::shared_ptr (Paylaşımlı Sahiplik)​


Bir bellek adresinin birden fazla sahibi olabilir. İçerisinde bir Reference Counter (Referans Sayacı) tutar. Nesneyi kaç kişinin kullandığını sayar; sayaç sıfıra düştüğünde bellek iade edilir.

C++:
void PaylasimliSahiplik() {
std::shared_ptr<int> sptr1 = std::make_shared<int>(42);
{
std::shared_ptr<int> sptr2 = sptr1; // Sayaç: 2 oldu
cout << "Kullanim Sayisi: " << sptr1.use_count() << endl;
} // sptr2 yok oldu, Sayaç: 1'e düştü
} // sptr1 yok oldu, Sayaç: 0 oldu ve bellek silindi.



3. std::weak_ptr (Zayıf Takipçi)​


shared_ptr ile birlikte kullanılır ancak referans sayısını artırmaz. Nesnenin hala hayatta olup olmadığını kontrol etmek (gözlemlemek) için kullanılır. Genellikle "Dairesel Referans" (Circular Reference) sorununu çözmek için tercih edilir.

C++:
std::shared_ptr<int> anaPtr = std::make_shared<int>(10);
std::weak_ptr<int> gozlemci = anaPtr;

if (auto geciciPtr = gozlemci.lock()) { // Nesne hala var mı?
cout << "Deger: " << *geciciPtr << endl;
} else {
cout << "Nesne silinmis!" << endl;
}



Smart Pointer Karşılaştırma Tablosu​


Özellikunique_ptrshared_ptrweak_ptr
SahiplikTek kişi.Birden fazla kişi.Sahiplenmez (Gözlemci).
KopyalanabilirHayır (Sadece taşınır).Evet.Evet.
PerformansÇok Yüksek (Sıfır maliyet).Orta (Sayaç maliyeti).Orta.
Otomatik SilmeEvet.Evet (Sayaç 0 olunca).Hayır.



Sonuç​


Modern C++'ta kural basittir: Mümkünse unique_ptr kullanın, eğer bir nesneyi birden fazla yerin paylaşması gerekiyorsa shared_ptr'a geçin. Manuel delete kullanımını tamamen bırakmak, sizi bellek sızıntıları ve "Dangling Pointer" hatalarından %100 koruyacaktır.
 
Geri
Üst