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 истифода мешавад. Вақте ки 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 ба як ва ҳамон блокуи идоракунӣ ишора мекунанд, ки шумораи нусхаҳои соҳибкориро назорат мекунад ва лаҳзаи озод кардани манбаъро муайян мекунад.