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
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!