Ссылки между двумя умными указателями - PullRequest
0 голосов
/ 22 февраля 2012

Чтение этого стекового потока ответ :

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

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

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

1 Ответ

2 голосов
/ 22 февраля 2012

В следующем примере ни один из 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.

...