Smart Pointer'lar (unique_ptr, shared_ptr): Manuel Bellek Yönetiminden Kurtulma
# Smart Pointer'lar (unique_ptr, shared_ptr): Manuel Bellek Yönetiminden Kurtulma
C++'da new ile bellek ayırırsan, delete ile geri vermek zorundasın. Ama bir hata olsa, exception fırlatsa, return yapsan, bellek sızıntısı oluşur. smart pointer'lar bunu otomatik yapar.
Smart pointer, bellek adresini saklayan bir nesne. Nesne yok olunca belleği otomatik serbest bırakır. Pointer gibi davranır ama güvenlidir.
İki ana tür vardır:
unique_ptr: Bir kişi sahip olur. Başkasına verilemez (taşınabilir).
shared_ptr: Birden fazla kişi sahip olabilir. Son kişi yok olunca bellek serbest bırakılır.
1#include <iostream>2#include <memory>3using namespace std;45class Araba {6public:7Araba(string isim): isim(isim) {8cout << isim << " üretildi\n";9}10~Araba() {11cout << isim << " yıkıldı\n";12}13void calis() { cout << isim << " çalışıyor\n"; }14private:15string isim;16};1718int main() {19{20unique_ptr<Araba> araba1(new Araba("Tesla"));21araba1->calis();22} // Buradan çıkınca Tesla otomatik yıkılır2324// Daha modern: make_unique25unique_ptr<Araba> araba2 = make_unique<Araba>("BMW");26araba2->calis();2728return 0;29}Çıktı:
1Tesla üretildi2Tesla çalışıyor3Tesla yıkıldı4BMW üretildi5BMW çalışıyor6BMW yıkıldı1#include <iostream>2#include <memory>3using namespace std;45class Kitap {6public:7Kitap(string baslik): baslik(baslik) {8cout << baslik << " yazıldı\n";9}10~Kitap() {11cout << baslik << " imha edildi\n";12}13private:14string baslik;15};1617int main() {18shared_ptr<Kitap> k1 = make_shared<Kitap>("1984");19{20shared_ptr<Kitap> k2 = k1; // k1 ile k2 aynı belleği paylaşır21cout << "k1 referans sayısı: " << k1.use_count() << "\n";22} // k2 yok olur ama k1 hala var2324cout << "k1 referans sayısı: " << k1.use_count() << "\n";2526return 0;27} // k1 yok olunca kitap imha edilirÇıktı:
11984 yazıldı2k1 referans sayısı: 23k1 referans sayısı: 141984 imha edildi- unique_ptr: Tek sahip, hızlı, hafif. Standart seç.
- shared_ptr: Çok sahip gerekiyorsa (ağaç, graf). Biraz yavaş.
- make_unique/make_shared: Hep bunu kullan, new yazma.
- delete yazma: Hiç yazma, otomatik olur.
Bellek sızıntısı artık senin sorunu değil.
3 yorum
unique_ptr ve shared_ptr farkını anlayınca bellek yönetimi çok daha rahat oluyor başında kafası karışabilir ama sonra alışıyorsun
unique_ptr'ı çalışken anlamak biraz zor oluyor, özellikle taşıma semantiğini kafana sokman lazım.
aynen taşıma kısmı işte kafayı karıştırıyor birinde sahiplik geçiyor diğerinde paylaşılıyor diye düşününce daha net oluyor bence