Modül dersleri (1/2)
std::unique_ptr ve std::shared_ptr
Klasik C++'da, new ve delete operatörlerini kullanan manuel bellek yönetimi, bellek sızıntıları (kaynaklar hiçbir zaman yayınlanmaz) veya sarkan işaretçiler (serbest bırakılan belleğe işaret eden işaretçiler) gibi yaygın bir hata kaynağıdır.
Modern C++, <memory> başlığında tanımlanan Akıllı İşaretçiler'i sunar. Akıllı işaretçi kapsam dışına çıktığında kaynağı serbest bırakarak, RAII'yi (Kaynak Edinme Başlatmadır) kullanarak yığına ayrılmış belleğin yaşam döngüsünü otomatik olarak yönetirler.
std::unique_ptr
std::unique_ptr, bir kaynağın münhasır sahipliği kavramını uygular. Kopyalanamaz, yalnızca taşınır (std::move aracılığıyla).
#include <memory>
// Recommended creation using std::make_unique (C++14)
std::unique_ptr<int> p1 = std::make_unique<int>(42);
// Accessing the resource like a normal pointer
std::cout << *p1 << std::endl;
// std::unique_ptr<int> p2 = p1; // COMPILER ERROR: copy not allowed!
std::unique_ptr<int> p2 = std::move(p1); // Allowed: p1 transfers ownership to p2std::shared_ptr
std::shared_ptr ortak sahiplik kavramını uygular. Birden fazla akıllı işaretçi aynı kaynağa işaret edebilir. Sınıf dahili olarak bir referans sayısını korur: bellek yalnızca son aktif shared_ptr yok edildiğinde veya sıfırlandığında serbest bırakılır.
#include <memory>
std::shared_ptr<int> s1 = std::make_shared<int>(100);
std::shared_ptr<int> s2 = s1; // Allowed: increments the reference count
std::cout << s1.use_count() << std::endl; // Prints 2 (s1 and s2 share the resource)Kendin dene
Ptr adında bir std::unique_ptr<int> bildirin ve onu 42 değerini tutan std::make_unique ile başlatın. Std::cout'u kullanarak ptr'nin referansı alınmış değerini yazdırın.
İpucu göster
'std::unique_ptr<int> ptr = std::make_unique<int>(42);' kullanın ve ardından çıkış akışına '*ptr' gönderin.
3 denemeden sonra çözüm mevcut
Std::make_shared kullanarak 100 değeriyle ptr1 adında bir std::shared_ptr<int> örneği oluşturun. Ptr2 adında bir kopya oluşturun ve ptr1.use_count() tarafından döndürülen değeri std::cout kullanarak yazdırın.
İpucu göster
Kopyalama standart atama yoluyla yapılır: `ptr2 = ptr1;`. 'ptr1.use_count()' yazdırıldığında 2 görüntülenmelidir.
3 denemeden sonra çözüm mevcut