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).

Reklam · TEST
AdSense Test ReklamıYazı arası (gönderi içi) · Yazı arası

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;
4
5class 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};
17
18int main() {
19{
20unique_ptr<Araba> araba1(new Araba("Tesla"));
21araba1->calis();
22} // Buradan çıkınca Tesla otomatik yıkılır
23
24// Daha modern: make_unique
25unique_ptr<Araba> araba2 = make_unique<Araba>("BMW");
26araba2->calis();
27
28return 0;
29}

Çıktı:

1Tesla üretildi
2Tesla çalışıyor
3Tesla yıkıldı
4BMW üretildi
5BMW çalışıyor
6BMW yıkıldı
1#include <iostream>
2#include <memory>
3using namespace std;
4
5class 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};
16
17int main() {
18shared_ptr<Kitap> k1 = make_shared<Kitap>("1984");
19{
20shared_ptr<Kitap> k2 = k1; // k1 ile k2 aynı belleği paylaşır
21cout << "k1 referans sayısı: " << k1.use_count() << "\n";
22} // k2 yok olur ama k1 hala var
23
24cout << "k1 referans sayısı: " << k1.use_count() << "\n";
25
26return 0;
27} // k1 yok olunca kitap imha edilir

Çıktı:

11984 yazıldı
2k1 referans sayısı: 2
3k1 referans sayısı: 1
41984 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.

Reklam · TEST
AdSense Test ReklamıGönderi altı · Görüntülü
konu hakkında tepkinizi verebilirsiniz

3 yorum

  • adlı kullanıcıya yanıt verdi
    kodkafasi

    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

  • eskiinternet

    unique_ptr'ı çalışken anlamak biraz zor oluyor, özellikle taşıma semantiğini kafana sokman lazım.

  • ucbeskelime

    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