Sobes.tech
Middle

C++ da shared_ptr qanday ishlaydi?

sobes.tech AI

AIdan javob

shared_ptr — bu umumiy resursga egalik qilish semantikasi amalga oshiriladigan aqlli ko'rsatkich. U ob'ektga ko'rsatkich va boshqaruv blokiga ko'rsatkichni saqlaydi.

Boshqaruv bloki quyidagilarni o'z ichiga oladi:

  • Kuchli havolalar hisoblagichi (reference count).
  • Zaif havolalar hisoblagichi (weak count).
  • Foydalanuvchi tomonidan belgilangan o'chirish funktori (deleter), agar belgilangan bo'lsa.
  • Foydalanuvchi tomonidan belgilangan ajratuvchi, agar belgilangan bo'lsa.
  • Saqlangan ob'ektga ko'rsatkich (shared_ptrda saqlangan bilan bir xil).

Ishlash prinsipi:

  1. Yaratish: Birinchi shared_ptr ob'ektga ko'rsatganda, boshqaruv bloki yaratiladi va havolalar hisoblagichlari boshlang'ich qiymatga ega bo'ladi: kuchli — 1, zaif — 0.
    std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // Int ob'ekt va boshqaruv bloki yaratadi
    
  2. Nusxa olish: shared_ptr nusxalanayotganda, boshqaruv blokidagi kuchli havolalar hisoblagichi 1 ga oshadi.
    std::shared_ptr<int> ptr2 = ptr1; // Kuchli havolalar hisoblagichini oshiradi
    
  3. Tayinlash: shared_ptr tayinlanganda, eski resurs kamaytiriladi (kuchli havolalar hisoblagichi kamayadi), yangi resurs esa oshiriladi (kattalashtiriladi).
    std::shared_ptr<int> ptr3;
    ptr3 = ptr1; // ptr3 ning eski resursi kamayadi, ptr1 ning resursi oshiriladi
    
  4. O'chirish: shared_ptr o'chirilganda (masalan, ko'lamdan chiqishda), kuchli havolalar hisoblagichi kamayadi.
    {
        std::shared_ptr<int> ptr4 = ptr1; // Kuchli havolalar hisoblagichini oshiradi
        // ptr4 ko'lamdan chiqadi
    } // Kuchli havolalar hisoblagichi kamayadi
    
  5. Resursni bo'shatish: Kuchli havolalar hisoblagichi nolga teng bo'lsa, resurs (shared_ptr ko'rsatgan ob'ekt) o'chiriladi, belgilangan o'chirish funktori yordamida (yoki delete default).
  6. Boshqaruv blokini bo'shatish: Ikkala hisoblagich (kuchli va zaif) nolga teng bo'lsa, boshqaruv bloki bo'shatiladi.

Afzalliklari:

  • Bo'linadigan resurslar uchun avtomatik xotira boshqaruvi.
  • Ikki marta bo'shatishga qarshi xavfsizlik.
  • Foydalanuvchi tomonidan belgilangan o'chirish funktorlarini qo'llab-quvvatlash.

Kamchiliklari:

  • Siklik bog'lanishlar xotira oqiblariga olib kelishi mumkin (weak_ptr yordamida hal qilinadi).
  • Boshqaruv bloki va atomik operatsiyalar uchun kichik qo'shimcha xarajat.
  • shared_ptr ning o'zi bilan (nusxa olish, tayinlash, o'zgartirish) operatsiyalar xavfsizligi, lekin ob'ekt bilan emas, unga ko'rsatadigan.