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_ptrhoudt een "zwakke" verwijzing naar het doorshared_ptrbeheerde object, zonder de sterke referentieteller te verhogen. - Controle van de levensduur van het object: Met de methode
lock()kan geprobeerd worden eenshared_ptrte krijgen vanweak_ptr. Als het object nog leeft, geeftlock()een geldigeshared_ptrterug; anders een lege. - Geen directe toegang:
weak_ptrbiedt geen directe toegang tot de inhoud van het object via de operators*of->. Toegang is alleen mogelijk na een succesvolle aanroep vanlock().
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.