Sobes.tech
Middle

Milline näitaja kasutatakse koos shared_ptr-iga?

sobes.tech AI

Vastus AI-lt

weak_ptr.

#include <memory>
#include <iostream>

int main() {
    auto shared = std::make_shared<int>(10); // Loome shared_ptr
    std::weak_ptr<int> weak = shared;      // Loome weak_ptr shared_ptr-st

    if (auto locked = weak.lock()) {       // Piemēģina iegūt shared_ptr no weak_ptr
        std::cout << "Vērtība: " << *locked << std::endl;
    } else {
        std::cout << "Objekt on kustutatud." << std::endl;
    }

    shared.reset(); // Objekt, mida haldab shared_ptr, kustutatakse

    if (auto locked = weak.lock()) {       // Teine katse, objekts on juba kustutatud
        std::cout << "Vērtība: " << *locked << std::endl;
    } else {
        std::cout << "Objekt on kustutatud." << std::endl;
    }

    return 0;
}

weak_ptr koos shared_ptr-ga kasutatakse tsükliliste viidete probleemi lahendamiseks ja mälu "lukustamise" vältimiseks, kui kaks või enam objekti, mida haldab shared_ptr, viitavad üksteisele ning viidete loendurid ei jõua kunagi nullini.

Siin on weak_ptr-i põhifunktsioonid:

  • Ei suurenda viidete loendurit: weak_ptr hoiab "nõrka" viidet objekti, mida haldab shared_ptr, ning ei suurenda selle tugevaid viiteid.
  • Objekti eluea kontroll: Kasutades meetodit lock(), saab proovida saada shared_ptr-i weak_ptr-st. Kui objekt on endiselt elus, lock() tagastab kehtiva shared_ptr-i; vastasel juhul - tühja shared_ptr-i.
  • Otsejuurdepääs puudub: weak_ptr ei võimalda otse juurdepääsu objekti sisule * või -> operaatoritega. Pääs on võimalik ainult pärast edukat lock()-i väljakutset.

weak_ptr kasutamine on standardne viis tsükliliste viidete katkestamiseks andmestruktuurides, mis kasutavad shared_ptr, näiteks graafides või kahetippelistel loenditel.