Re: Умные указатели в C++
От: Юрий Жмеренецкий ICQ 380412032
Дата: 29.08.08 05:01
Оценка:
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 избыточен.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.