Sobes.tech
Middle

shared_ptr менен кайсы көрсөткүч колдонулат?

sobes.tech AI

AIден жооп

weak_ptr.

#include <memory>
#include <iostream>

int main() {
    auto shared = std::make_shared<int>(10); // Орноштуруу shared_ptr
    std::weak_ptr<int> weak = shared;      // shared_ptr'дон weak_ptr түзүү

    if (auto locked = weak.lock()) {       // weak_ptr'дон shared_ptr алуу аракетин көрүү
        std::cout << "Кийим: " << *locked << std::endl;
    } else {
        std::cout << "Объект өчүрүлгөн." << std::endl;
    }

    shared.reset(); // shared_ptr көрсөтүп турган объект өчүрүлөт

    if (auto locked = weak.lock()) {       // Экинчи аракет, объект азыр өчүрүлгөн
        std::cout << "Кийим: " << *locked << std::endl;
    } else {
        std::cout << "Объект өчүрүлгөн." << std::endl;
    }

    return 0;
}

weak_ptr менен shared_ptr биргелешип колдонулуп, циклик шилтемелер маселесин чечет жана эскерүүлөрдү алдын алат, эгерде эки же андан көп объект shared_ptr менен башкарылса жана бири-бирине шилтеме кылса, жана шилтемелердин санагычтары нөлгө жетпесе.

Негизги weak_ptr өзгөчөлүктөрү:

  • Күчтүү шилтемелер санын көбөйтпөйт: weak_ptr shared_ptr тарабынан башкарылуучу объектке "слабую" шилтемени сактайт, анын күчтүү шилтемелер санын көбөйтпөйт.
  • Объекттин жашоо мөөнөтүн текшерүү: lock() методу аркылуу weak_ptr'дон shared_ptr алуу аракетин жасоого болот. Эгер объект дагы жаш болсо, lock() жарактуу shared_ptr кайтарат; эгер жок болсо, бош shared_ptr кайтарат.
  • Түздөн-түз кирүү жок: weak_ptr * же -> операторлору аркылуу объекттин мазмунуна түздөн-түз кирүүнү камсыз кылбайт. Кирүү гана lock() ийгиликтүү чакырылганда мүмкүн.

weak_ptr колдонуу — бул shared_ptr колдонгон структураларда шилтемелер циклин үзүү үчүн стандарттык ыкма, мисалы графтарда же эки тараптуу тизмектерде.