Ссылки между двумя интеллектуальными указателями

Читая этот stackoverflow ответ:

QWeakPointer — чувствуете ли вы повторяющийся паттерн? Так же, как std::weak_ptr и boost::weak_ptr, это используется в сочетании с QSharedPointer, когда вам нужны ссылки между двумя интеллектуальными указателями, которые в противном случае не привели бы к удалению ваших объектов.

Мой вопрос - может ли кто-нибудь объяснить мне такую ​​​​ситуацию на простом примере, когда два ссылающихся умных указателя могут вызывать неудаляемые объекты?

Заранее спасибо..


person Tim Kachko    schedule 21.02.2012    source источник


Ответы (1)


В следующем примере ни один из объектов S никогда не будет уничтожен, потому что объект, на который указывает a, владеет объектом, на который указывает b, и наоборот.

struct S {
    std::shared_ptr<S> p;
};

void f()
{
    std::shared_ptr<S> a(new S());
    std::shared_ptr<S> b(new S());
    a->p = b;
    b->p = a;
}

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

Те же принципы применимы к интеллектуальным указателям Qt, таким как QWeakPointer.

person James McNellis    schedule 21.02.2012