Zirkuläre Referenzen und Shared Pointers
Beim Arbeiten mit std::shared_ptr
könnten Sie auf ein Problem stoßen, das als zirkuläre Referenz bekannt ist. Eine zirkuläre Referenz tritt auf, wenn zwei Objekte shared_ptr
-Referenzen aufeinander halten. Da shared_ptr
Referenzzählung verwendet, erreicht die Zählung niemals null, was zu einem Speicherleck führt.
main.cpp
1234567891011121314151617181920212223242526#include <iostream> #include <memory> class B; // Forward declaration class A { public: std::shared_ptr<B> p_b; ~A() { std::cout << "A destroyed\n"; } }; class B { public: ~B() { std::cout << "B destroyed\n"; } std::shared_ptr<A> p_a; }; int main() { std::shared_ptr<A> a = std::make_shared<A>(); std::shared_ptr<B> b = std::make_shared<B>(); a->p_b = b; b->p_a = a; }
Es gibt eine Möglichkeit, dieses Problem zu beheben: Sie müssen einen anderen Typ von Smart Pointer verwenden.
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
Zirkuläre Referenzen und Shared Pointers
Swipe um das Menü anzuzeigen
Beim Arbeiten mit std::shared_ptr
könnten Sie auf ein Problem stoßen, das als zirkuläre Referenz bekannt ist. Eine zirkuläre Referenz tritt auf, wenn zwei Objekte shared_ptr
-Referenzen aufeinander halten. Da shared_ptr
Referenzzählung verwendet, erreicht die Zählung niemals null, was zu einem Speicherleck führt.
main.cpp
1234567891011121314151617181920212223242526#include <iostream> #include <memory> class B; // Forward declaration class A { public: std::shared_ptr<B> p_b; ~A() { std::cout << "A destroyed\n"; } }; class B { public: ~B() { std::cout << "B destroyed\n"; } std::shared_ptr<A> p_a; }; int main() { std::shared_ptr<A> a = std::make_shared<A>(); std::shared_ptr<B> b = std::make_shared<B>(); a->p_b = b; b->p_a = a; }
Es gibt eine Möglichkeit, dieses Problem zu beheben: Sie müssen einen anderen Typ von Smart Pointer verwenden.
Danke für Ihr Feedback!