Middle
C++'та shared_ptr кантип иштейт?
sobes.tech AI
AIден жооп
shared_ptr — бул акылдуу көрсөткүч, бөлүшүлгөн ресурстун ээлигин семантикасын ишке ашырат. Ал объектке көрсөткүчтү жана башкаруучу блокту сактайт.
Баскаруучу блок төмөнкүлөрдү камтыйт:
- Катуу шилтемелердин санагыч (reference count).
- Слаб шилтемелердин санагыч (weak count).
- Колдонуучунун өчүргүч функтору (deleter), эгер берилсе.
- Колдонуучунун бөлүштүргүчү, эгер берилсе.
shared_ptrөзү сактаган объектке көрсөткүч.
Иштөө принциби:
- Жасоо: Биринчи
shared_ptrобъектке көрсөтүп жатканда, башкаруучу блок түзүлөт, шилтемелердин санагычтары баштапкы мааниге келет: күчтүү — 1, алсыз — 0.std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // Объект жана башкаруучу блок түзөт - Көчүрүү:
shared_ptrкөчүрүлгөндө, башкаруучу блоктогу күчтүү шилтемелердин саны 1ге көбөйөт.std::shared_ptr<int> ptr2 = ptr1; // Санын көбөйтөт - Белгилейт:
shared_ptrбелгиленгенде, эски ресурстун шилтемелер саны азайтылат, жаңы ресурстун саны көбөйтүлөт.std::shared_ptr<int> ptr3; ptr3 = ptr1; // Эскисин азайтат, жаңысына көбөйтөт - Өчүрүү:
shared_ptrжок кылынганда (мисалы, көрүү чөйрөсүнөн чыгуу), шилтемелер саны азайтылат.{ std::shared_ptr<int> ptr4 = ptr1; // Санын көбөйтөт // ptr4 чыгат } // Санын азайтат - Ресурсту бошотуу: Шилтемелер саны нөлгө жеткенде, объект жоголот, белгиленген өчүргүч колдонулат.
- Баскаруучу блокту бошотуу: Эки санак (күчтүү жана алсыз) нөлгө жеткенде, блок бошотулат.
Артыкчылыктары:
- Эске тутуу автоматтык башкаруу.
- Эки эсеге бөлүнүүнү коргоо.
- Колдонуучунун функцияларын колдоо.
Кемчиликтери:
- Циклдык шилтемелер эс тутумдун агып кетишине алып келиши мүмкүн (
weak_ptrменен чечилет). - Башкаруучу блок жана атомардык операциялардын кошумча чыгымдары.
shared_ptrменен операциялар (көчүрүү, белгилөө, өзгөртүү), бирок объект менен эмес, ал көрсөтүп жаткан объект менен иштейт.