Middle
Jaký ukazatel se používá spolu s shared_ptr?
sobes.tech AI
Odpověď od AI
weak_ptr.
#include <memory>
#include <iostream>
int main() {
auto shared = std::make_shared<int>(10); // Vytvoření sdíleného ukazatele
std::weak_ptr<int> weak = shared; // Vytvoření weak_ptr z shared_ptr
if (auto locked = weak.lock()) { // Pokus o získání shared_ptr z weak_ptr
std::cout << "Hodnota: " << *locked << std::endl;
} else {
std::cout << "Objekt byl odstraněn." << std::endl;
}
shared.reset(); // Objekt, na který ukazuje shared_ptr, je odstraněn
if (auto locked = weak.lock()) { // Opětovný pokus, objekt již byl odstraněn
std::cout << "Hodnota: " << *locked << std::endl;
} else {
std::cout << "Objekt byl odstraněn." << std::endl;
}
return 0;
}
weak_ptr spolu s shared_ptr se používá k řešení problémů cyklických odkazů a prevenci "memory leak" při dvou nebo více objektech spravovaných shared_ptr, které se odkazují navzájem, a počítadla odkazů nikdy nedosáhnou nuly.
Hlavní vlastnosti weak_ptr:
- Nezvyšuje počítadlo odkazů:
weak_ptrudržuje "slabé" odkazování na objekt spravovanýshared_ptr, aniž by zvyšovalo jeho počet silných odkazů. - Kontrola životnosti objektu: Pomocí metody
lock()lze zkusit získatshared_ptrzweak_ptr. Pokud je objekt stále živý,lock()vrátí platnýshared_ptr; jinak prázdný. - Žádný přímý přístup:
weak_ptrneposkytuje přímý přístup k obsahu objektu přes operátory*nebo->. Přístup je možný pouze po úspěšném volánílock().
Použití weak_ptr je standardní způsob, jak přerušit cykly odkazů v datových strukturách používajících shared_ptr, například v grafech nebo dvoustranných seznamech.