Ana içeriğe geç
Modül 7 · Ders 1 ders 2Kurstaki 15/18~12 min
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).

C++
#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 p2

std::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.

C++
#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

Egzersiz#cpp.m7.l1.e1
Denemeler: 0Yükleniyor…

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.

Düzenleyici yükleniyor…
İ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

Egzersiz#cpp.m7.l1.e2
Denemeler: 0Yükleniyor…

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.

Düzenleyici yükleniyor…
İ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