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:
- Yaratish: Birinchi
shared_ptrob'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 - Nusxa olish:
shared_ptrnusxalanayotganda, boshqaruv blokidagi kuchli havolalar hisoblagichi 1 ga oshadi.std::shared_ptr<int> ptr2 = ptr1; // Kuchli havolalar hisoblagichini oshiradi - Tayinlash:
shared_ptrtayinlanganda, 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 - O'chirish:
shared_ptro'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 - Resursni bo'shatish: Kuchli havolalar hisoblagichi nolga teng bo'lsa, resurs (
shared_ptrko'rsatgan ob'ekt) o'chiriladi, belgilangan o'chirish funktori yordamida (yokideletedefault). - 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_ptryordamida hal qilinadi). - Boshqaruv bloki va atomik operatsiyalar uchun kichik qo'shimcha xarajat.
shared_ptrning o'zi bilan (nusxa olish, tayinlash, o'zgartirish) operatsiyalar xavfsizligi, lekin ob'ekt bilan emas, unga ko'rsatadigan.