Sobes.tech
Middle

C++ da unique_ptr qanday ishlaydi?

sobes.tech AI

AIdan javob

std::unique_ptr — bu aqlli ko‘rsatkich bo‘lib, dinamik tarzda ajratilgan ob’ektning eksklyuziv egaligini amalga oshiradi. U avtomatik xotira boshqaruvini ta’minlaydi: unique_ptr ko‘rsatadigan ob’ekt unique_ptr yo‘q qilinishi bilan avtomatik ravishda o‘chiriladi.

Asosiy xususiyatlar:

  • Eksklyuziv egalik: Har qanday vaqtda, faqat bitta unique_ptr muayyan ob’ektni egallashi mumkin.
  • Nusxa olishning yo‘qligi: unique_ptr nusxa ko‘chirib bo‘lmaydi. Bu bir ob’ektning ko‘p egalariga ega bo‘lishi va "ikkilamchi o‘chirish" muammosini oldini oladi.
  • Harakat semantikasini: Ob’ekt egasligi std::move yordamida bir unique_ptr dan boshqasiga o‘tkazilishi mumkin.
  • Moslashtiriladigan o‘chirgich: Maxsus resurslarni bo‘shatish usullarini boshqarish uchun o‘zingizning o‘chirgichingizni taqdim etishingiz mumkin.

Ishlash prinsipi RAII (Resource Acquisition Is Initialization) asosida: resurs (dinamik ajratilgan xotira) ob’ekt yaratilganda olinadi (unique_ptr) va o‘chirilganda bo‘shatiladi.

#include <memory> // unique_ptr uchun
#include <iostream>

class MyClass {
public:
    MyClass() { std::cout << "MyClass yaratildi\n"; }
    ~MyClass() { std::cout << "MyClass o‘chirildi\n"; }
};

int main() {
    {   
        // MyClass ob’ektini egallovchi unique_ptr yaratish
        std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>(); 
        
        // Hozir, ptr1 muayyan ob’ektning eksklyuziv egasidir
        // auto ptr2 = ptr1; // Xato: nusxa ko‘chirib bo‘lmaydi

        // Egashuvni ptr1 dan ptr2 ga o‘tkazish
        std::unique_ptr<MyClass> ptr2 = std::move(ptr1); 
        
        // Ko‘chirishdan so‘ng, ptr1 ob’ektga ega emas (nullptr bo‘ldi)
        if (!ptr1) {
            std::cout << "ptr1 ob’ektga ega emas: " << (ptr1 ? "Ha" : "Yo‘q") << "\n";
        }

        // ptr2 ning amal qilish muddati bu yerda tugaydi.
        // ptr2 o‘chiriladi va unga egalik qilgan MyClass ob’ekti avtomatik ravishda o‘chiriladi.
    } // MyClass ob’ekti bu yerda o‘chiriladi

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

    return 0;
}

Raw pointer bilan taqqoslaganda:

Xususiyat raw pointer std::unique_ptr
Resurs egaligi Belgilanmagan Eksklyuziv
Avtomatik o‘chirish Yo‘q Ha
Nusxa olish semantikasini Ha Yo‘q (faqat harakat)
Xotira oqib ketish xavfi Yuqori Past

Umuman olganda, unique_ptr C++11 va undan yuqori versiyalarda dinamik xotira boshqarish uchun afzal ko‘rilgan usul bo‘lib, qat’iy egalik va avtomatik resurslarni bo‘shatishni talab qiladigan hollarda ishlatiladi.