Middle
Milyen mutató használható a shared_ptr mellett?
sobes.tech MI
Válasz az MI-től
weak_ptr.
#include <memory>
#include <iostream>
int main() {
auto shared = std::make_shared<int>(10); // Létrehozunk egy shared_ptr-t
std::weak_ptr<int> weak = shared; // Létrehozunk egy weak_ptr-t a shared_ptr-ből
if (auto locked = weak.lock()) { // Megpróbálunk egy shared_ptr-t szerezni a weak_ptr-ből
std::cout << "Érték: " << *locked << std::endl;
} else {
std::cout << "Objektum törölve." << std::endl;
}
shared.reset(); // Az objektum, amire a shared_ptr mutat, törlődik
if (auto locked = weak.lock()) { // Újra próbálkozás, az objektum már törölve
std::cout << "Érték: " << *locked << std::endl;
} else {
std::cout << "Objektum törölve." << std::endl;
}
return 0;
}
A weak_ptr és a shared_ptr együttműködése a ciklikus hivatkozások problémájának megoldására szolgál, és megakadályozza a memória szivárgását, amikor két vagy több shared_ptr által kezelt objektum egymásra hivatkozik, és a hivatkozási számlálók soha nem érnek el nullát.
A weak_ptr fő jellemzői:
- Nem növeli a hivatkozásszámot: A
weak_ptregy "gyenge" hivatkozást tart fenn ashared_ptráltal kezelt objektumra, anélkül, hogy növelné a erős hivatkozásszámot. - Az objektum életciklusának ellenőrzése: A
lock()metódussal megpróbálhatunk egyshared_ptr-t szerezni aweak_ptr-ből. Ha az objektum még él, alock()érvényesshared_ptr-t ad vissza; különben, egy üresshared_ptr-t. - Közvetlen hozzáférés hiánya: A
weak_ptrnem biztosít közvetlen hozzáférést az objektum tartalmához a*vagy->operátorokkal. A hozzáférés csak alock()sikeres hívása után lehetséges.
A weak_ptr használata egy szabványos módszer a ciklikus hivatkozások megszakítására olyan adatszerkezetekben, amelyek shared_ptr-t használnak, például gráfokban vagy kétszintű listákban.