Sobes.tech
Middle

C++'та shared_ptr кантип иштейт?

sobes.tech AI

AIден жооп

shared_ptr — бул акылдуу көрсөткүч, бөлүшүлгөн ресурстун ээлигин семантикасын ишке ашырат. Ал объектке көрсөткүчтү жана башкаруучу блокту сактайт.

Баскаруучу блок төмөнкүлөрдү камтыйт:

  • Катуу шилтемелердин санагыч (reference count).
  • Слаб шилтемелердин санагыч (weak count).
  • Колдонуучунун өчүргүч функтору (deleter), эгер берилсе.
  • Колдонуучунун бөлүштүргүчү, эгер берилсе.
  • shared_ptr өзү сактаган объектке көрсөткүч.

Иштөө принциби:

  1. Жасоо: Биринчи shared_ptr объектке көрсөтүп жатканда, башкаруучу блок түзүлөт, шилтемелердин санагычтары баштапкы мааниге келет: күчтүү — 1, алсыз — 0.
    std::shared_ptr<int> ptr1 = std::make_shared<int>(10); // Объект жана башкаруучу блок түзөт
    
  2. Көчүрүү: shared_ptr көчүрүлгөндө, башкаруучу блоктогу күчтүү шилтемелердин саны 1ге көбөйөт.
    std::shared_ptr<int> ptr2 = ptr1; // Санын көбөйтөт
    
  3. Белгилейт: shared_ptr белгиленгенде, эски ресурстун шилтемелер саны азайтылат, жаңы ресурстун саны көбөйтүлөт.
    std::shared_ptr<int> ptr3;
    ptr3 = ptr1; // Эскисин азайтат, жаңысына көбөйтөт
    
  4. Өчүрүү: shared_ptr жок кылынганда (мисалы, көрүү чөйрөсүнөн чыгуу), шилтемелер саны азайтылат.
    {
        std::shared_ptr<int> ptr4 = ptr1; // Санын көбөйтөт
        // ptr4 чыгат
    } // Санын азайтат
    
  5. Ресурсту бошотуу: Шилтемелер саны нөлгө жеткенде, объект жоголот, белгиленген өчүргүч колдонулат.
  6. Баскаруучу блокту бошотуу: Эки санак (күчтүү жана алсыз) нөлгө жеткенде, блок бошотулат.

Артыкчылыктары:

  • Эске тутуу автоматтык башкаруу.
  • Эки эсеге бөлүнүүнү коргоо.
  • Колдонуучунун функцияларын колдоо.

Кемчиликтери:

  • Циклдык шилтемелер эс тутумдун агып кетишине алып келиши мүмкүн (weak_ptr менен чечилет).
  • Башкаруучу блок жана атомардык операциялардын кошумча чыгымдары.
  • shared_ptr менен операциялар (көчүрүү, белгилөө, өзгөртүү), бирок объект менен эмес, ал көрсөтүп жаткан объект менен иштейт.