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;      // Эҷод кардани weak_ptr аз shared_ptr

    if (auto locked = weak.lock()) {       // кӯшиши гирифтани shared_ptr аз weak_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() метавон кӯшиш кард, ки shared_ptr аз weak_ptr гирифта шавад. Агар объект ҳанӯз зинда бошад, lock() shared_ptr-и дуруст медиҳад; дар ғайри ҳол, shared_ptr холӣ.
  • Бе дастрасии мустақим: weak_ptr дастрасии мустақим ба мазмуни объектро тавассути операторҳои * ё -> намедиҳад. Дастрасӣ танҳо пас аз даъвати муваффақи lock() имконпазир аст.

Истифодаи weak_ptr роҳи стандартӣ барои шикастани гирдоби ишораҳо дар сохторҳои додаҳое мебошад, ки shared_ptr-ро истифода мебаранд, масалан, графҳо ё рӯйхатҳои дутарафа.