Rompiendo Referencias Circulares con Weak Pointers
Los punteros débiles están diseñados para romper referencias circulares. Al reemplazar un std::shared_ptr
en una dependencia circular con un std::weak_ptr
, evitamos que los objetos extiendan involuntariamente la vida útil de los demás, permitiendo una destrucción adecuada.
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 }
El problema de la referencia circular se resuelve cambiando next
de un std::shared_ptr
a un std::weak_ptr
. Sigue los comentarios en el código para una comprensión más clara. ¡Ejecuta el código para confirmar que los destructores ahora se llaman correctamente sin fugas de memoria!
¡Gracias por tus comentarios!
Pregunte a AI
Pregunte a AI
Pregunte lo que quiera o pruebe una de las preguntas sugeridas para comenzar nuestra charla
Awesome!
Completion rate improved to 5.56
Rompiendo Referencias Circulares con Weak Pointers
Desliza para mostrar el menú
Los punteros débiles están diseñados para romper referencias circulares. Al reemplazar un std::shared_ptr
en una dependencia circular con un std::weak_ptr
, evitamos que los objetos extiendan involuntariamente la vida útil de los demás, permitiendo una destrucción adecuada.
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 }
El problema de la referencia circular se resuelve cambiando next
de un std::shared_ptr
a un std::weak_ptr
. Sigue los comentarios en el código para una comprensión más clara. ¡Ejecuta el código para confirmar que los destructores ahora se llaman correctamente sin fugas de memoria!
¡Gracias por tus comentarios!