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