Sobes.tech
Middle

Kuris rodyklis naudojamas kartu su shared_ptr?

sobes.tech AI

Atsakymas iš AI

weak_ptr.

#include <memory>
#include <iostream>

int main() {
    auto shared = std::make_shared<int>(10); // Sukuriamas shared_ptr
    std::weak_ptr<int> weak = shared;      // Sukuriamas weak_ptr iš shared_ptr

    if (auto locked = weak.lock()) {       // Bandymas gauti shared_ptr iš weak_ptr
        std::cout << "Reikšmė: " << *locked << std::endl;
    } else {
        std::cout << "Objektas ištrintas." << std::endl;
    }

    shared.reset(); // Objektas, kurį valdo shared_ptr, yra ištrintas

    if (auto locked = weak.lock()) {       // Pakartotinis bandymas, objektas jau ištrintas
        std::cout << "Reikšmė: " << *locked << std::endl;
    } else {
        std::cout << "Objektas ištrintas." << std::endl;
    }

    return 0;
}

weak_ptr kartu su shared_ptr naudojamas spręsti ciklinių nuorodų problemą ir išvengti "atminties užšalimo", kai du ar daugiau objektų, valdoma shared_ptr, nurodo vienas kitą, ir nuorodų skaitikliai niekada nepasiekia nulio.

Štai pagrindinės weak_ptr savybės:

  • Ne didina nuorodų skaitiklio: weak_ptr saugo "silpną" nuorodą į objektą, valdoma shared_ptr, ir tuo pat metu nepadidina jo stiprių nuorodų skaitiklio.
  • Objekto gyvybingumo patikrinimas: Naudojant lock() metodą galima bandyti gauti shared_ptrweak_ptr. Jei objektas vis dar gyvas, lock() grąžins galiojantį shared_ptr; priešingu atveju - tuščią shared_ptr.
  • Tiesioginė prieiga neįmanoma: weak_ptr nesuteikia tiesioginės prieigos prie objekto turinio per * ar -> operatorius. Prieiga įmanoma tik po sėkmingo lock() iškvietimo.

weak_ptr naudojimas yra standartinis būdas nutraukti ciklines nuorodas duomenų struktūrose, kurios naudoja shared_ptr, pavyzdžiui, grafus ar dvigubai susietus sąrašus.