Casser les Références Circulaires avec des Pointeurs Faibles
Les pointeurs faibles sont conçus pour briser les références circulaires. En remplaçant un std::shared_ptr
dans une dépendance circulaire par un std::weak_ptr
, nous empêchons les objets de prolonger involontairement la durée de vie les uns des autres, permettant ainsi une destruction appropriée.
main.cpp
12345678910111213141516171819202122232425#include <iostream> #include <memory> class Node { public: Node() { std::cout << "Node constructed." << std::endl; } ~Node() { std::cout << "Node destructed." << std::endl; } // A weak pointer to the next element prevents circular ownership. std::weak_ptr<Node> next; }; int main() { // Creating three Node objects. std::shared_ptr<Node> node1 = std::make_shared<Node>(); std::shared_ptr<Node> node2 = std::make_shared<Node>(); std::shared_ptr<Node> node3 = std::make_shared<Node>(); // Creating a list where the last node's next is a weak pointer node1->next = node2; node2->next = node3; node3->next = node1; // Now when node1, node2, and node3 go out of scope, their destructors will be called }
Le problème de référence circulaire est résolu en changeant next
d'un std::shared_ptr
à un std::weak_ptr
. Suivez les commentaires dans le code pour une compréhension plus claire. Exécutez le code pour confirmer que les destructeurs sont maintenant appelés correctement pas de fuites de mémoire !
Merci pour vos commentaires !
Demandez à l'IA
Demandez à l'IA
Posez n'importe quelle question ou essayez l'une des questions suggérées pour commencer notre discussion
Awesome!
Completion rate improved to 5.56
Casser les Références Circulaires avec des Pointeurs Faibles
Glissez pour afficher le menu
Les pointeurs faibles sont conçus pour briser les références circulaires. En remplaçant un std::shared_ptr
dans une dépendance circulaire par un std::weak_ptr
, nous empêchons les objets de prolonger involontairement la durée de vie les uns des autres, permettant ainsi une destruction appropriée.
main.cpp
12345678910111213141516171819202122232425#include <iostream> #include <memory> class Node { public: Node() { std::cout << "Node constructed." << std::endl; } ~Node() { std::cout << "Node destructed." << std::endl; } // A weak pointer to the next element prevents circular ownership. std::weak_ptr<Node> next; }; int main() { // Creating three Node objects. std::shared_ptr<Node> node1 = std::make_shared<Node>(); std::shared_ptr<Node> node2 = std::make_shared<Node>(); std::shared_ptr<Node> node3 = std::make_shared<Node>(); // Creating a list where the last node's next is a weak pointer node1->next = node2; node2->next = node3; node3->next = node1; // Now when node1, node2, and node3 go out of scope, their destructors will be called }
Le problème de référence circulaire est résolu en changeant next
d'un std::shared_ptr
à un std::weak_ptr
. Suivez les commentaires dans le code pour une compréhension plus claire. Exécutez le code pour confirmer que les destructeurs sont maintenant appelés correctement pas de fuites de mémoire !
Merci pour vos commentaires !