Кайсы негизде бир нече 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 бирдей башкаруу блогуна шилтеме кылышат, ал алардын көчүрмөлөрүнүн санын көзөмөлдөйт жана башкарылуучу ресурстун бошотулушу учурун аныктайт.