Sobes.tech
Middle

Jaki wskaźnik jest używany razem z shared_ptr?

sobes.tech AI

Odpowiedź od AI

weak_ptr.

#include <memory>
#include <iostream>

int main() {
    auto shared = std::make_shared<int>(10); // Tworzymy shared_ptr
    std::weak_ptr<int> weak = shared;      // Tworzymy weak_ptr z shared_ptr

    if (auto locked = weak.lock()) {       // Próba uzyskania shared_ptr z weak_ptr
        std::cout << "Wartość: " << *locked << std::endl;
    } else {
        std::cout << "Obiekt usunięty." << std::endl;
    }

    shared.reset(); // Obiekt, na który wskazuje shared_ptr, jest usuwany

    if (auto locked = weak.lock()) {       // Druga próba, obiekt już został usunięty
        std::cout << "Wartość: " << *locked << std::endl;
    } else {
        std::cout << "Obiekt usunięty." << std::endl;
    }

    return 0;
}

weak_ptr wraz z shared_ptr służy do rozwiązywania problemów cyklicznych odwołań i zapobiegania "zawieszeniu" pamięci, gdy dwa lub więcej obiektów zarządzanych przez shared_ptr odwołuje się do siebie nawzajem, a liczniki odwołań nigdy nie osiągają zera.

Oto główne właściwości weak_ptr:

  • Nie zwiększa licznika odwołań: weak_ptr przechowuje "słabe" odwołanie do obiektu zarządzanego przez shared_ptr, nie zwiększając jego licznika silnych odwołań.
  • Sprawdzanie życia obiektu: Za pomocą metody lock() można próbować uzyskać shared_ptr z weak_ptr. Jeśli obiekt jest nadal żywy, lock() zwróci ważny shared_ptr; w przeciwnym razie - pusty shared_ptr.
  • Brak bezpośredniego dostępu: weak_ptr nie zapewnia bezpośredniego dostępu do zawartości obiektu za pomocą operatorów * lub ->. Dostęp jest możliwy tylko po pomyślnym wywołaniu lock().

Użycie weak_ptr jest standardowym sposobem rozwiązywania cykli odwołań w strukturach danych korzystających z shared_ptr, takich jak grafy czy listy dwukierunkowe.