Sobes.tech
Junior

C++ da qanday aqlli ko'rsatkichlar mavjud?

sobes.tech AI

AIdan javob

std::unique_ptr, std::shared_ptr, std::weak_ptr.

  • std::unique_ptr:

    • Ob'ektning eksklyuziv mulkiyati.
    • Nusxa ko'chirilmaydi, lekin harakatlantirilishi mumkin (std::move).
    • unique_ptr ning hududidan chiqib ketganda yoki yo'q qilinadigan bo'lsa, ob'ekt avtomatik ravishda o'chiriladi.
    • Yengil, qo'shimcha xarajatlar yo'q, referenslar hisoblagichi uchun.
    #include <memory>
    
    // unique_ptr yaratish
    std::unique_ptr<int> up1(new int(10));
    
    // Egashuvni ko'chirish
    std::unique_ptr<int> up2 = std::move(up1);
    
    // up1 endi nullptr
    // up2 ob'ektni egallaydi
    
  • std::shared_ptr:

    • Ob'ektning umumiy mulkiyati.
    • Resursga qaysi shared_ptrlar murojaat qilayotganini kuzatish uchun referenslar hisoblagichi ishlatiladi.
    • Oxirgi shared_ptr yo'q qilinsa, ob'ekt o'chiriladi.
    • Ko'chirilishi va harakatlanishi mumkin.
    • Referenslar hisoblagichi uchun qo'shimcha xarajatlar (odatda alohida ajratiladi).
    • Siklik bog'lanishlar hosil qilishi mumkin, bu esa xotira oqishiga olib keladi.
    #include <memory>
    
    // shared_ptr yaratish
    std::shared_ptr<int> sp1 = std::make_shared<int>(20);
    
    // Egashuvni nusxalash
    std::shared_ptr<int> sp2 = sp1; // Referenslar soni oshadi
    
    // sp1 va sp2 ob'ektni egallaydi
    
  • std::weak_ptr:

    • Ob'ektni egallamaydi.
    • Bir yoki bir nechta shared_ptr tomonidan boshqariladigan ob'ektga "zaif" havola sifatida xizmat qiladi.
    • shared_ptrlar orasidagi siklik bog'lanishni oldini olish uchun ishlatiladi.
    • Ob'ektning referenslar hisoblagichini oshirmaydi.
    • Ob'ektga xavfsiz kirish uchun, uni lock() metodi yordamida shared_ptr ga aylantirish kerak. Agar ob'ekt allaqachon o'chirilgan bo'lsa, lock() bo'sh shared_ptr qaytaradi.
    #include <memory>
    
    // shared_ptr yaratish
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // shared_ptr dan weak_ptr yaratish
    std::weak_ptr<int> wp = sp;
    
    // Ob'ektni tekshirish va foydalanish
    if (auto shared_from_weak = wp.lock()) {
        // shared_from_weak orqali ob'ektga kirish
    } else {
        // Ob'ekt allaqachon o'chirilgan
    }