Я думаю, что мой вопрос похож на общие_ptr и weak_ptr различия, но я интересно посмотреть, как они работают вместе, а не список различий.
Страница Википедии на shared_ptr и weak_ptr указывает, что weak_pointer
можно использовать для решения проблемы циклической зависимости. , и он дает пример:
std::shared_ptr<int> p1(new int(5));
std::weak_ptr<int> wp1 = p1; //p1 owns the memory.
{
std::shared_ptr<int> p2 = wp1.lock(); //Now p1 and p2 own the memory.
if(p2) //Always check to see if the memory still exists
{
//Do something with p2
}
} //p2 is destroyed. Memory is owned by p1.
p1.reset(); //Memory is deleted.
std::shared_ptr<int> p3 = wp1.lock(); //Memory is gone, so we get an empty shared_ptr.
if(p3)
{
//Will not execute this.
}
Но я не вижу циклической зависимости, поэтому не понимаю, как weak_pointer
решает проблему.
Я ожидал увидеть какой-то объект a
, указывающий на объект b
, и b
каким-то образом указывающий обратно на a
(с weak_ptr
, помещенным между одним из ребер ориентированного графа, чтобы разорвать цепочку).
Является ли пример хорошим, а мое мышление плохим? Или есть лучший пример проблемы и решения?