2014-01-13 6 views
1

Я думаю, что мой вопрос похож на shared_ptr and weak_ptr differences, но мне интересно посмотреть, как они работают вместе, а не список различий.shared_ptr, weak_ptr и круговые зависимости

страница Википедии о shared_ptr and 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 каким-то образом указывает обратно на aweak_ptr подкладками между одной из направленных ребер графа, чтобы разорвать цепь).

Является ли пример хорошим, и я плохо думаю? Или есть лучший пример проблемы и решения?

+0

«_state weak_pointer можно использовать для решения проблемы с циклической зависимостью», и оба они совершенно ошибочны; слабые ссылки имеют мало пользы, а круговая зависимость не одна – curiousguy

ответ

1

В текущей версии страницы wikipedia пример демонстрирует использование std::weak_ptr в целом, не исключая, в частности, сильные циклические ссылки. (Круговые ссылки упоминаются только после пример был представлен.)

Что пример показывает, что wp1, несмотря на всю жизнь, не принадлежит памяти, на которую указывает p1, и что wp1 правильно обнаруживает удаление этой памяти после сброса p1. Другими словами, wp1 не мешали удалению динамически выделенного объекта и не приводили к неопределенному поведению, когда удаленный объект (правильно) получался через слабый указатель.

Поскольку они не мешают освобождению, слабые указатели полезны не только для исключения ссылочных циклов, но и для реализации ассоциативных массивов, которые хранят дополнительные свойства или кэшированные расчетные свойства существующих объектов. Поскольку такие кеши не мешают освобождению, они могут полагаться на первичные объекты, которые удаляются, когда они больше не используются, без необходимости в политике выселения, связанной с кешем.

Смежные вопросы