Resource management
R.24
Используйте `std::weak_ptr` для разрыва циклов `shared_ptr`
Причина
shared_ptr используют счётчик ссылок, который в циклической структуре никогда не достигает нуля — поэтому нужен механизм для уничтожения циклической структуры.
Пример
#include <memory>
class bar;
class foo {
public:
explicit foo(const std::shared_ptr<bar>& forward_reference)
: forward_reference_(forward_reference)
{ }
private:
std::shared_ptr<bar> forward_reference_;
};
class bar {
public:
explicit bar(const std::weak_ptr<foo>& back_reference)
: back_reference_(back_reference)
{ }
void do_something()
{
if (auto shared_back_reference = back_reference_.lock()) {
// Используем *shared_back_reference
}
}
private:
std::weak_ptr<foo> back_reference_;
};
Примечание
??? (HS: Многие говорят «для разрыва циклов», хотя «временное разделённое владение» точнее.) ??? (BS: разрыв циклов — это то, что нужно сделать; временное разделение владения — то, как это делается. «Временно разделить владение» можно было бы и с помощью ещё одного shared_ptr.)
Контроль
??? Вероятно, невозможно. Если бы мы могли статически обнаруживать циклы, weak_ptr не был бы нужен.