IS>weak_ptr ссылается на экземпляр, которым владеет shared_ptr, однако не разделяет прав владения этим экземпляром. Это гарантирует, что если экземпляр уже уничтожен, мы сможем это надёжно и безопасно проверить.
class MyClass
{
public:
MyClass(const std::tr1::weak_ptr<SomeClass>& ptr) :
ptr_(ptr)
{
}
void SomeMethod()
{
if (!ptr_.expired())
{
std::tr1::shared_ptr<SomeClass> realPtr(ptr_.lock());
realPtr->DoSomething();
}
}
private:
std::tr1::weak_ptr<SomeClass> ptr_;
};
Хотя weak_ptr::expired и предназначен для использования в указанном выше сценарии(см. выделенное), но в коде показано совершенно другое. В присутствии многопоточности этот код может привести в ошибке т.к даже если вызов weak_ptr::expired вернет false, это не дает гарантии что weak_ptr::lock возвратит валидный объект. Перед вызовом weak_ptr::lock вызов weak_ptr::expired избыточен.