Middle
Aký ukazovateľ sa používa spolu s shared_ptr?
sobes.tech AI
Odpoveď od AI
weak_ptr.
#include <memory>
#include <iostream>
int main() {
auto shared = std::make_shared<int>(10); // Ustvarimo shared_ptr
std::weak_ptr<int> weak = shared; // Ustvarimo weak_ptr iz shared_ptr
if (auto locked = weak.lock()) { // Poskus pridobivanja shared_ptr iz weak_ptr
std::cout << "Vrednost: " << *locked << std::endl;
} else {
std::cout << "Objekt je izbrisan." << std::endl;
}
shared.reset(); // Objekt, na katerega kaže shared_ptr, se izbriše
if (auto locked = weak.lock()) { // Ponovni poskus, objekt je že izbrisan
std::cout << "Vrednost: " << *locked << std::endl;
} else {
std::cout << "Objekt je izbrisan." << std::endl;
}
return 0;
}
weak_ptr skupaj s shared_ptr se uporablja za reševanje problemov cikličnih referenc in za preprečevanje "memory leak" pri dveh ali več objektih, ki jih upravljata shared_ptr in se medsebojno sklicujejo, in števec referenc nikoli ne doseže nič.
Glavne lastnosti weak_ptr:
- Ne povečuje števec referenc:
weak_ptrhrani "šibko" referenco na objekt, ki ga upravljashared_ptr, brez povečevanja števca močnih referenc. - Preverjanje življenja objekta: Z metodo
lock()lahko poskusite pridobitishared_ptrizweak_ptr. Če je objekt še živ, bolock()vrnil veljavenshared_ptr; sicer, prazenshared_ptr. - Brez neposrednega dostopa:
weak_ptrne omogoča neposrednega dostopa do vsebine objekta preko operatorjev*ali->. Dostop je možen le po uspešnem kliculock().
Uporaba weak_ptr je standardni način za prekinitev ciklov v referencah v podatkovnih strukturah, ki uporabljajo shared_ptr, kot so grafi ali dvostruko povezane sezname.