Références Circulaires et Shared Pointers
Lorsque vous travaillez avec std::shared_ptr
, vous pourriez rencontrer un problème connu sous le nom de référence circulaire. Une référence circulaire se produit lorsque deux objets détiennent des références shared_ptr
l'un à l'autre. Étant donné que shared_ptr
utilise le comptage de références, le compte n'atteint jamais zéro, provoquant une fuite de mémoire.
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; }
Il existe un moyen de résoudre ce problème, vous devez utiliser un type différent de smart pointer.
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
Références Circulaires et Shared Pointers
Glissez pour afficher le menu
Lorsque vous travaillez avec std::shared_ptr
, vous pourriez rencontrer un problème connu sous le nom de référence circulaire. Une référence circulaire se produit lorsque deux objets détiennent des références shared_ptr
l'un à l'autre. Étant donné que shared_ptr
utilise le comptage de références, le compte n'atteint jamais zéro, provoquant une fuite de mémoire.
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; }
Il existe un moyen de résoudre ce problème, vous devez utiliser un type différent de smart pointer.
Merci pour vos commentaires !