Breaking Circular References With Weak Pointers
Weak pointers are designed to break circular references. By replacing a std::shared_ptr
in a circular dependency with a std::weak_ptr
, we prevent objects from unintentionally extending each other's lifetimes, allowing proper destruction.
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 }
The circular reference problem is resolved by changing next
from a std::shared_ptr
to a std::weak_ptr
. Follow the comments in the code for a clearer understanding. Run the code to confirm that the destructors are now called properly no memory leaks!
Kiitos palautteestasi!
Kysy tekoälyä
Kysy tekoälyä
Kysy mitä tahansa tai kokeile jotakin ehdotetuista kysymyksistä aloittaaksesi keskustelumme
Awesome!
Completion rate improved to 5.56
Breaking Circular References With Weak Pointers
Pyyhkäise näyttääksesi valikon
Weak pointers are designed to break circular references. By replacing a std::shared_ptr
in a circular dependency with a std::weak_ptr
, we prevent objects from unintentionally extending each other's lifetimes, allowing proper destruction.
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 }
The circular reference problem is resolved by changing next
from a std::shared_ptr
to a std::weak_ptr
. Follow the comments in the code for a clearer understanding. Run the code to confirm that the destructors are now called properly no memory leaks!
Kiitos palautteestasi!