Sobes.tech
Middle

Koji pokazivač se koristi zajedno sa shared_ptr?

sobes.tech АИ

Одговор од АИ

weak_ptr.

#include <memory>
#include <iostream>

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

    if (auto locked = weak.lock()) {       // Pokušaj dobijanja shared_ptr od weak_ptr
        std::cout << "Vrednost: " << *locked << std::endl;
    } else {
        std::cout << "Objekat je obrisan." << std::endl;
    }

    shared.reset(); // Objekat na koji ukazuje shared_ptr se briše

    if (auto locked = weak.lock()) {       // Drugi pokušaj, objekat je već obrisan
        std::cout << "Vrednost: " << *locked << std::endl;
    } else {
        std::cout << "Objekat je obrisan." << std::endl;
    }

    return 0;
}

weak_ptr zajedno sa shared_ptr se koristi za rešavanje problema cikličnih referenci i za sprečavanje "memory leak" kada dva ili više objekata kojima upravljaju shared_ptr ukazuju jedan na drugog, a brojači referenci nikada ne dostignu nulu.

Osobine weak_ptr:

  • Ne povećava brojač referenci: weak_ptr drži "slabu" referencu na objekat koji upravlja shared_ptr, bez povećanja njegovog brojačja jakih referenci.
  • Provera životnog ciklusa objekta: Korišćenjem metode lock() može se pokušati dobiti shared_ptr iz weak_ptr. Ako je objekat još uvek živ, lock() će vratiti validan shared_ptr; u suprotnom, prazan shared_ptr.
  • Bez direktnog pristupa: weak_ptr ne pruža direktan pristup sadržaju objekta putem operatora * ili ->. Pristup je moguć samo nakon uspešnog poziva lock().

Korišćenje weak_ptr je standardni način za prekidanje cikličnih referenci u strukturama podataka koje koriste shared_ptr, kao što su grafovi ili dvostruko povezane liste.