Middle
Koji pokazivač se koristi zajedno sa shared_ptr?
sobes.tech АИ
Одговор од АИ
weak_ptr.
#include <memory>
#include <iostream>
int main() {
auto shared = std::make_shared<int>(10); // Kreiramo shared_ptr
std::weak_ptr<int> weak = shared; // Kreiramo weak_ptr od shared_ptr
if (auto locked = weak.lock()) { // Pokušaj dobijanja shared_ptr od weak_ptr
std::cout << "Vrednost: " << *locked << std::endl;
} else {
std::cout << "Objekat je obrisan." << std::endl;
}
shared.reset(); // Objekat na koji ukazuje shared_ptr se briše
if (auto locked = weak.lock()) { // Drugi pokušaj, objekat je već obrisan
std::cout << "Vrednost: " << *locked << std::endl;
} else {
std::cout << "Objekat je obrisan." << std::endl;
}
return 0;
}
weak_ptr zajedno sa shared_ptr se koristi za rešavanje problema cikličnih referenci i za sprečavanje "memory leak" kada dva ili više objekata kojima upravljaju shared_ptr ukazuju jedan na drugog, a brojači referenci nikada ne dostignu nulu.
Osobine weak_ptr:
- Ne povećava brojač referenci:
weak_ptrdrži "slabu" referencu na objekat koji upravljashared_ptr, bez povećanja njegovog brojačja jakih referenci. - Provera životnog ciklusa objekta: Korišćenjem metode
lock()može se pokušati dobitishared_ptrizweak_ptr. Ako je objekat još uvek živ,lock()će vratiti validanshared_ptr; u suprotnom, prazanshared_ptr. - Bez direktnog pristupa:
weak_ptrne pruža direktan pristup sadržaju objekta putem operatora*ili->. Pristup je moguć samo nakon uspešnog pozivalock().
Korišćenje weak_ptr je standardni način za prekidanje cikličnih referenci u strukturama podataka koje koriste shared_ptr, kao što su grafovi ili dvostruko povezane liste.