Aufbrechen von Zirkulären Referenzen mit Weak Pointers
Schwache Zeiger sind dazu gedacht, zirkuläre Referenzen zu durchbrechen. Indem wir einen std::shared_ptr
in einer zirkulären Abhängigkeit durch einen std::weak_ptr
ersetzen, verhindern wir, dass Objekte unbeabsichtigt die Lebensdauer des jeweils anderen verlängern, was eine ordnungsgemäße Zerstörung ermöglicht.
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 }
Das Problem der zirkulären Referenz wird gelöst, indem next
von einem std::shared_ptr
zu einem std::weak_ptr
geändert wird. Folgen Sie den Kommentaren im Code für ein klareres Verständnis. Führen Sie den Code aus, um zu bestätigen, dass die Destruktoren jetzt ordnungsgemäß aufgerufen werden keine Speicherlecks!
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Awesome!
Completion rate improved to 5.56
Aufbrechen von Zirkulären Referenzen mit Weak Pointers
Swipe um das Menü anzuzeigen
Schwache Zeiger sind dazu gedacht, zirkuläre Referenzen zu durchbrechen. Indem wir einen std::shared_ptr
in einer zirkulären Abhängigkeit durch einen std::weak_ptr
ersetzen, verhindern wir, dass Objekte unbeabsichtigt die Lebensdauer des jeweils anderen verlängern, was eine ordnungsgemäße Zerstörung ermöglicht.
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 }
Das Problem der zirkulären Referenz wird gelöst, indem next
von einem std::shared_ptr
zu einem std::weak_ptr
geändert wird. Folgen Sie den Kommentaren im Code für ein klareres Verständnis. Führen Sie den Code aus, um zu bestätigen, dass die Destruktoren jetzt ordnungsgemäß aufgerufen werden keine Speicherlecks!
Danke für Ihr Feedback!