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_ptrhoiab "nõrka" viidet objekti, mida haldabshared_ptr, ning ei suurenda selle tugevaid viiteid. - Objekti eluea kontroll: Kasutades meetodit
lock(), saab proovida saadashared_ptr-iweak_ptr-st. Kui objekt on endiselt elus,lock()tagastab kehtivashared_ptr-i; vastasel juhul - tühjashared_ptr-i. - Otsejuurdepääs puudub:
weak_ptrei võimalda otse juurdepääsu objekti sisule*või->operaatoritega. Pääs on võimalik ainult pärast edukatlock()-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.