Sobes.tech
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_ptr udrž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ískat shared_ptr z weak_ptr. Pokud je objekt stále živý, lock() vrátí platný shared_ptr; jinak prázdný.
  • Žádný přímý přístup: weak_ptr neposkytuje 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.