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_ptrsaugo "silpną" nuorodą į objektą, valdomashared_ptr, ir tuo pat metu nepadidina jo stiprių nuorodų skaitiklio. - Objekto gyvybingumo patikrinimas: Naudojant
lock()metodą galima bandyti gautishared_ptrišweak_ptr. Jei objektas vis dar gyvas,lock()grąžins galiojantįshared_ptr; priešingu atveju - tuščiąshared_ptr. - Tiesioginė prieiga neįmanoma:
weak_ptrnesuteikia tiesioginės prieigos prie objekto turinio per*ar->operatorius. Prieiga įmanoma tik po sėkmingolock()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.