Циклічні Посилання та Спільні Вказівники
Під час роботи з std::shared_ptr ви можете зіткнутися з проблемою, відомою як циклічне посилання. Циклічне посилання виникає, коли два об'єкти утримують shared_ptr посилання один на одного. Оскільки shared_ptr використовує підрахунок посилань, кількість ніколи не досягає нуля, що спричиняє витік пам'яті.
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; }
Існує спосіб вирішити цю проблему, вам потрібно використовувати інший тип розумного вказівника.
Дякуємо за ваш відгук!
Запитати АІ
Запитати АІ
Запитайте про що завгодно або спробуйте одне із запропонованих запитань, щоб почати наш чат
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?
Чудово!
Completion показник покращився до 5.56
Циклічні Посилання та Спільні Вказівники
Свайпніть щоб показати меню
Під час роботи з std::shared_ptr ви можете зіткнутися з проблемою, відомою як циклічне посилання. Циклічне посилання виникає, коли два об'єкти утримують shared_ptr посилання один на одного. Оскільки shared_ptr використовує підрахунок посилань, кількість ніколи не досягає нуля, що спричиняє витік пам'яті.
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; }
Існує спосіб вирішити цю проблему, вам потрібно використовувати інший тип розумного вказівника.
Дякуємо за ваш відгук!