Sobes.tech
Middle

C++-də unique_ptr necə işləyir?

sobes.tech Süni İntellekt

AI-dan cavab

std::unique_ptr — bu ağıllı göstəricidir ki, dinamik olaraq ayrılmış obyektin müstəsna mülkiyyətini həyata keçirir. O, avtomatik yaddaş idarəsini təmin edir: unique_ptr-in göstərdiyi obyekt, unique_ptr-in məhvi zamanı avtomatik olaraq silinir.

Əsas xüsusiyyətlər:

  • Müstəsna mülkiyyət: Hər zaman yalnız bir unique_ptr müəyyən obyekti idarə edə bilər.
  • Kopyalama yoxdur: unique_ptr kopyalana bilməz. Bu, çoxsaylı mülkiyyət və "ikiqat silmə" problemini qarşısını alır.
  • Hərəkət semantikasını: Obyektin mülkiyyəti std::move istifadə edilərək bir unique_ptr-dən digərinə ötürülə bilər.
  • Tənzimlənə bilən silici: Xüsusi resursların azad olunma üsullarını idarə etmək üçün öz silicinizi təmin edə bilərsiniz.

İş prinsipi RAII (Resource Acquisition Is Initialization) əsasında qurulub: resurs (dinamik ayrılmış yaddaş) obyekt yaradılarkən əldə edilir (unique_ptr) və məhv edilərkən azad edilir.

#include <memory> // unique_ptr üçün
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "MyClass yaradıldı\n"; }
    ~MyClass() { std::cout << "MyClass silindi\n"; }
};

int main() {
    {   
        // MyClass obyektini idarə edən unique_ptr yaradılması
        std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(); 
        
        // Bu anda, ptr1 obyektin müstəsna sahibi olur
        // auto ptr2 = ptr1; // Səhv: kopyalama qadağandır

        // Mülkiyyətin ptr1-dən ptr2-yə köçürülməsi
        std::unique_ptr<MyClass> ptr2 = std::move(ptr1); 
        
        // Köçürmədən sonra, ptr1 artıq obyektə sahib deyil (nullptr olur)
        if (!ptr1) {
            std::cout << "ptr1 obyektə sahib deyil: " << (ptr1 ? "Bəli" : "Xeyr") << "\n";
        }

        // ptr2-nin ömrü burada bitir.
        // ptr2 məhv edilir və onun sahibi olduğu MyClass obyekti avtomatik silinir.
    } // MyClass obyekti burada silinir

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

    return 0;
}

Raw pointer ilə müqayisədə:

Xüsusiyyət raw pointer std::unique_ptr
Resursun mülkiyyəti Təyin olunmayıb Eksklüziv
Avtomatik silmə Yox Bəli
Kopyalama semantikasını Bəli Yox (yalnız hərəkət)
Yaddaş sızması riski Yüksək Aşağı

Ümumiyyətlə, unique_ptr C++11 və daha yuxarı versiyalarda dinamik yaddaşın idarə olunması üçün üstün üsuldur, xüsusən də sərt mülkiyyət və avtomatik resurs azadlığı tələb olunduqda.