Sobes.tech
Middle

C++'ta unique_ptr nasıl çalışır?

sobes.tech yapay zeka

AI'dan gelen yanıt

std::unique_ptr — dinamik olarak tahsis edilen nesne üzerinde münhasır sahipliği uygulayan akıllı bir göstergedir. Otomatik bellek yönetimi sağlar: unique_ptr tarafından işaret edilen nesne, unique_ptr yok edildiğinde otomatik olarak silinir.

Ana özellikler:

  • Münhasır sahiplik: Her zaman, yalnızca bir unique_ptr belirli bir nesneyi sahip olabilir.
  • Kopyalama yok: unique_ptr kopyalanamaz. Bu, çoklu sahipliği ve "çift silme" sorununu önler.
  • Taşıma semantiği: Nesne sahipliği, taşıma semantiği (std::move) kullanılarak bir unique_ptr'den diğerine aktarılabilir.
  • Yapılandırılabilir silici: Kaynakların serbest bırakılma biçimlerini yönetmek için kendi silicinizi sağlayabilirsiniz.

Çalışma prensibi RAII (Resource Acquisition Is Initialization) ilkesine dayanır: kaynak (dinamik olarak tahsis edilen bellek), nesne oluşturulurken edinilir (unique_ptr) ve yok edilirken serbest bırakılır.

#include <memory> // unique_ptr için
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "MyClass oluşturuldu\n"; }
    ~MyClass() { std::cout << "MyClass yok edildi\n"; }
};

int main() {
    {   
        // MyClass nesnesini sahipleyen bir unique_ptr oluşturma
        std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(); 
        
        // Bu noktada, ptr1 nesnenin münhasır sahibidir
        // auto ptr2 = ptr1; // Derleme hatası: kopyalama engellenmiş

        // Sahipliği ptr1'den ptr2'ye taşıma
        std::unique_ptr<MyClass> ptr2 = std::move(ptr1); 
        
        // Taşıma sonrası, ptr1 artık nesneye sahip değil (nullptr oldu)
        if (!ptr1) {
            std::cout << "ptr1 nesneye sahip değil: " << (ptr1 ? "Evet" : "Hayır") << "\n";
        }

        // ptr2'nin kapsamı burada sona erer.
        // ptr2 yok edilir ve sahip olduğu MyClass nesnesi otomatik olarak silinir.
    } // MyClass nesnesi burada yok edilir

    std::cout << "main sonu.\n";

    return 0;
}

Raw pointer ile karşılaştırma:

Özellik raw pointer std::unique_ptr
Kaynak sahipliği Belirlenmemiş Münhasır
Otomatik silme Hayır Evet
Kopyalama semantiği Evet Hayır (sadece taşıma)
Bellek sızıntısı riski Yüksek Düşük

Genel olarak, unique_ptr, C++11 ve sonrası sürümlerde, katı sahiplik ve otomatik kaynak serbest bırakma gerektiren durumlar için tercih edilen bellek yönetim yöntemidir.