Sobes.tech
Junior

C++та кандай акылдуу көрсөткүчтөр бар?

sobes.tech AI

AIден жооп

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

  • std::unique_ptr:

    • Объекттиң эксклюзивтүү ээлиги.
    • Көчүрүлө албайт, бирок которулушу мүмкүн (std::move).
    • Объект автоматтык түрдө жоголот, көрүү чөйрөсүнөн чыгуу же unique_ptr жок кылуу менен.
    • Жеңил, шилтемелер санагычына кошумча чыгымдар жок.
    #include <memory>
    
    // `unique_ptr` түзүү
    std::unique_ptr<int> up1(new int(10));
    
    // ээлик кылууну которуу
    std::unique_ptr<int> up2 = std::move(up1);
    
    // up1 азыр nullptr
    // up2 объектти ээлик кылат
    
  • std::shared_ptr:

    • Объектти биргелешип ээлик кылуу.
    • Ресурска шилтемелер санын көзөмөлдөө үчүн эсептегичти колдонуу.
    • Эң акыркы shared_ptr жок кылынганда гана объект жоголот.
    • Көчүрүү жана которуу мүмкүн.
    • Шилтемелер санагычына кошумча чыгымдар (адатта бөлүнүп алынады).
    • Циклдик шилтемелер пайда болушу мүмкүн, бул эс тутумдун агып кетүүсүнө алып келет.
    #include <memory>
    
    // `shared_ptr` түзүү
    std::shared_ptr<int> sp1 = std::make_shared<int>(20);
    
    // ээлик кылууну көчүрүү
    std::shared_ptr<int> sp2 = sp1; // шилтемелер саны өсөт
    
    // sp1 жана sp2 объектти ээлик кылат
    
  • std::weak_ptr:

    • Объектти ээлик кылбайт.
    • Объектти башкарган бир же бир нече shared_ptr менен "слабую" шилтемени көрсөтөт.
    • shared_ptr ортосунда циклик шилтемелердин алдын алууга колдонулат.
    • Шилтемелер санагычын көбөйтпөйт.
    • Объектке коопсуз кирүү үчүн lock() методу менен shared_ptr кылып өзгөртүлүшү керек. Эгер объект алда канча жок болсо, lock() бош shared_ptr кайтарат.
    #include <memory>
    
    // `shared_ptr` түзүү
    std::shared_ptr<int> sp = std::make_shared<int>(30);
    
    // `weak_ptr` түзүү
    std::weak_ptr<int> wp = sp;
    
    // Текшерүү жана колдонуу
    if (auto shared_from_weak = wp.lock()) {
        // Объектке кирүү
    } else {
        // Объект алда канча жок
    }