Sobes.tech
Middle

Кайсы негизде бир нече shared_ptr объектиси бир эле көрсөткүчкө шилтеме кыла алат?

sobes.tech AI

AIден жооп

Кээ бир std::shared_ptr объектиси бирдей көрсөткүчкө шилтеме кыла алат, анткени башкаруу блогунун (control block) болушу менен.

Башкаруу блогу, ал башкарылуучу объект менен байланышкан, төмөнкүлөрдү камтыйт:

  • Катуу шилтемелердин санагыч (strong reference count): Жаңы shared_ptr түзүлгөндө көбөйөт. shared_ptr жок болуп калганда азаяды. Эгер нөлгө жетсе, байланышкан объект (көрсөткүч) өчүрүлөт.
  • Слаб шилтемелердин санагыч (weak reference count): std::weak_ptr үчүн колдонулат. shared_ptrтен weak_ptr түзүлгөндө көбөйөт. weak_ptr жок болуп калганда азаяды. Эки санагыч нөлгө жетсе, башкаруу блогу өчүрүлөт.
  • Башкарылуучу объектке өзүнүн көрсөткүчү: Дата көрсөткүчү эмес, ал блок тарабынан башкарылат.

Эгер сиз shared_ptrти бар shared_ptrтен түзсөңүз (копиялоо, көчүрмө берүү), алар бирдей башкаруу блогун колдонушат жана бул блоктогу катуу шилтемелердин саны көбөйөт.

Мисал:

#include <memory>
#include <iostream>

struct MyData {
    int value;
    MyData(int v) : value(v) { std::cout << "MyData(" << value << ") created.\n"; }
    ~MyData() { std::cout << "MyData(" << value << ") destroyed.\n"; }
};

int main() {
    // Биринчи `shared_ptr` түзүү:
    // Башкаруу блог жана MyData объектиси түзүлөт:
    // Катуу шилтемелер: 1, Слаб: 0.
    std::shared_ptr<MyData> ptr1 = std::make_shared<MyData>(10);
    std::cout << "ptr1 use count: " << ptr1.use_count() << "\n";

    // Экинчи `shared_ptr` түзүү ptr1ден:
    // Ошол эле башкаруу блогун колдонуу:
    // Катуу шилтемелер саны 2ге көтөрүлөт:
    std::shared_ptr<MyData> ptr2 = ptr1;
    std::cout << "ptr1 use count: " << ptr1.use_count() << "\n";
    std::cout << "ptr2 use count: " << ptr2.use_count() << "\n";

    // Үчүнчү `shared_ptr` түзүү ptr1ден:
    // Ошол эле башкаруу блогун колдонуу:
    // Катуу шилтемелер саны 3кө көтөрүлөт:
    std::shared_ptr<MyData> ptr3 = ptr1;
     std::cout << "ptr1 use count: " << ptr1.use_count() << "\n";
    std::cout << "ptr2 use count: " << ptr2.use_count() << "\n";
    std::cout << "ptr3 use count: " << ptr3.use_count() << "\n";

    std::cout << "Областыктан чыгуу.\n";
    // ptr3 облустуктан чыгат:
    // Катуу шилтемелер саны 2ге төмөндөйт:
    // ptr2 облустуктан чыгат:
    // Катуу шилтемелер саны 1ге төмөндөйт:
    // ptr1 облустуктан чыгат:
    // Катуу шилтемелер саны 0гө төмөндөйт:
    // MyData объектиси жоголот:
    // Башкаруу блогу өчүрүлөт:
}

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