Взглянув на std::weak_ptr
Я видел в нескольких местах, что его можно использовать для устранения утечек памяти из-за циклических зависимостей при использовании std::shared_ptr
. См., Например, эти два принятых ответа: [1] , [2] .
Принимая последний ссылочный ответ, предлагаем исправление:
#include <memory>
#include <iostream>
struct B;
struct A {
std::shared_ptr<B> b;
~A() { std::cout << "~A()\n"; }
};
struct B {
std::weak_ptr<A> a;
~B() { std::cout << "~B()\n"; }
};
void useAnB() {
auto a = std::make_shared<A>();
auto b = std::make_shared<B>();
a->b = b;
b->a = a;
}
int main() {
useAnB();
std::cout << "Finished using A and B\n";
}
Это похоже на излишество, но почему бы просто не использовать ссылку? Я понимаю, что в этом примере b->a
не установлен в конструкторе, так что ссылка не будет действительно сокращать его, поэтому мой вопрос:
Есть ли причина использовать std::weak_ptr
вместо ссылки, если
дело в том, чтобы разорвать круговую зависимость, если мы можем установить ее в
конструктор?
ПРИМЕЧАНИЕ: Я понимаю полезность std::weak_ptr
для хранения ссылки, которая может быть признана недействительной. Мой вопрос касается только полезности, когда дело исключительно в нарушении круговой зависимости.