Referências Circulares e Shared Pointers
Ao trabalhar com std::shared_ptr
, você pode encontrar um problema conhecido como referência circular. Uma referência circular ocorre quando dois objetos mantêm referências shared_ptr
um ao outro. Como shared_ptr
usa contagem de referências, a contagem nunca chega a zero, causando um vazamento de memória.
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; }
Há uma maneira de corrigir esse problema, você precisa usar um tipo diferente de smart pointer.
Obrigado pelo seu feedback!
Pergunte à IA
Pergunte à IA
Pergunte o que quiser ou experimente uma das perguntas sugeridas para iniciar nosso bate-papo
What type of smart pointer should I use to fix circular references?
Can you explain how to avoid circular references with smart pointers?
Can you provide an example of fixing this issue?
Awesome!
Completion rate improved to 5.56
Referências Circulares e Shared Pointers
Deslize para mostrar o menu
Ao trabalhar com std::shared_ptr
, você pode encontrar um problema conhecido como referência circular. Uma referência circular ocorre quando dois objetos mantêm referências shared_ptr
um ao outro. Como shared_ptr
usa contagem de referências, a contagem nunca chega a zero, causando um vazamento de memória.
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; }
Há uma maneira de corrigir esse problema, você precisa usar um tipo diferente de smart pointer.
Obrigado pelo seu feedback!