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
| Özellik | unique_ptr | shared_ptr | weak_ptr |
|---|---|---|---|
| Sahiplik | Tek kişi. | Birden fazla kişi. | Sahiplenmez (Gözlemci). |
| Kopyalanabilir | Hayır (Sadece taşınır). | Evet. | Evet. |
| Performans | Çok Yüksek (Sıfır maliyet). | Orta (Sayaç maliyeti). | Orta. |
| Otomatik Silme | Evet. | 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.