Sobes.tech
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_ptr egy "gyenge" hivatkozást tart fenn a shared_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 egy shared_ptr-t szerezni a weak_ptr-ből. Ha az objektum még él, a lock() érvényes shared_ptr-t ad vissza; különben, egy üres shared_ptr-t.
  • Közvetlen hozzáférés hiánya: A weak_ptr nem biztosít közvetlen hozzáférést az objektum tartalmához a * vagy -> operátorokkal. A hozzáférés csak a lock() 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.