Sobes.tech
Middle

Welke pointer wordt samen met shared_ptr gebruikt?

sobes.tech AI

Antwoord van AI

weak_ptr.

#include <memory>
#include <iostream>

int main() {
    auto shared = std::make_shared<int>(10); // Maak een shared_ptr
    std::weak_ptr<int> weak = shared;      // Maak een weak_ptr van shared_ptr

    if (auto locked = weak.lock()) {       // Probeer een shared_ptr te krijgen van weak_ptr
        std::cout << "Waarde: " << *locked << std::endl;
    } else {
        std::cout << "Object verwijderd." << std::endl;
    }

    shared.reset(); // Het object waarnaar shared_ptr verwijst wordt verwijderd

    if (auto locked = weak.lock()) {       // Tweede poging, object is al verwijderd
        std::cout << "Waarde: " << *locked << std::endl;
    } else {
        std::cout << "Object verwijderd." << std::endl;
    }

    return 0;
}

weak_ptr samen met shared_ptr wordt gebruikt om cyclische verwijzingen op te lossen en geheugenlekken te voorkomen wanneer twee of meer objecten beheerd door shared_ptr naar elkaar verwijzen, en de tellers nooit op nul komen.

Hier zijn de belangrijkste eigenschappen van weak_ptr:

  • Verhoogt de referentieteller niet: weak_ptr houdt een "zwakke" verwijzing naar het door shared_ptr beheerde object, zonder de sterke referentieteller te verhogen.
  • Controle van de levensduur van het object: Met de methode lock() kan geprobeerd worden een shared_ptr te krijgen van weak_ptr. Als het object nog leeft, geeft lock() een geldige shared_ptr terug; anders een lege.
  • Geen directe toegang: weak_ptr biedt geen directe toegang tot de inhoud van het object via de operators * of ->. Toegang is alleen mogelijk na een succesvolle aanroep van lock().

Het gebruik van weak_ptr is een standaardmethode om cycli in referenties te doorbreken in datastructuren die shared_ptr gebruiken, zoals grafen of dubbel gekoppelde lijsten.