Middle
Quel pointeur est utilisé avec shared_ptr ?
sobes.tech IA
Réponse de l'IA
weak_ptr.
#include <memory>
#include <iostream>
int main() {
auto shared = std::make_shared<int>(10); // Créer un shared_ptr
std::weak_ptr<int> weak = shared; // Créer un weak_ptr à partir du shared_ptr
if (auto locked = weak.lock()) { // Essayer d'obtenir un shared_ptr à partir du weak_ptr
std::cout << "Valeur : " << *locked << std::endl;
} else {
std::cout << "Objet supprimé." << std::endl;
}
shared.reset(); // L'objet pointé par shared_ptr est supprimé
if (auto locked = weak.lock()) { // Deuxième tentative, l'objet est déjà supprimé
std::cout << "Valeur : " << *locked << std::endl;
} else {
std::cout << "Objet supprimé." << std::endl;
}
return 0;
}
weak_ptr utilisé avec shared_ptr sert à résoudre les problèmes de références cycliques et à prévenir le "memory hang" lorsque deux ou plusieurs objets gérés par shared_ptr se réfèrent mutuellement, et que les compteurs de références n'atteignent jamais zéro.
Voici les principales propriétés de weak_ptr :
- Ne augmente pas le compteur de références :
weak_ptrmaintient une référence "faible" à l'objet géré parshared_ptr, sans augmenter son compteur de références fortes. - Vérification de la vie de l'objet : Avec la méthode
lock(), on peut tenter d'obtenir unshared_ptrà partir duweak_ptr. Si l'objet est encore vivant,lock()renverra unshared_ptrvalide ; sinon, unshared_ptrvide. - Pas d'accès direct :
weak_ptrne fournit pas d'accès direct au contenu de l'objet via les opérateurs*ou->. L'accès est possible uniquement après un appel réussi àlock().
L'utilisation de weak_ptr est une méthode standard pour rompre les cycles de références dans des structures de données utilisant shared_ptr, comme les graphes ou les listes doublement chaînées.