Барои кадом асос чанд объектҳои shared_ptr метавонанд ба як ишорагардон ишора кунанд?
sobes.tech AI
Ҷавоб аз AI
Баъзе объектҳои std::shared_ptr метавонанд ба як нишондиҳанда ишора кунанд, бо сабаби мавҷудияти блокуи идоракунӣ (control block).
Блокуи идоракунӣ, ки бо объекти идорашаванда алоқаманд аст, дорои:
- Шумораи истинодҳои қавӣ (strong reference count): Вақте ки
shared_ptrнав барои ҳамон объект сохта мешавад, меафзояд. Вақте киshared_ptrнест мешавад, кам мешавад. Вақте ки ба сифр мерасад, объект (нишондиҳанда) нест карда мешавад. - Шумораи истинодҳои суст (weak reference count): Барои
std::weak_ptrистифода мешавад. Вақте киweak_ptrазshared_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 ба як ва ҳамон блокуи идоракунӣ ишора мекунанд, ки шумораи нусхаҳои соҳибкориро назорат мекунад ва лаҳзаи озод кардани манбаъро муайян мекунад.