Это старый вопрос, и принятый ответ хорош, поэтому я не решаюсь опубликовать другой ответ, но одна вещь, которая, по-видимому, отсутствует, является хорошим примером идиоматического использования:
boost::weak_ptr<T> weak_example;
...
if (boost::shared_ptr<T> example = weak_example.lock())
{
// do something with example; it's safe to use example.get() to get the
// raw pointer, *only if* it's only used within this scope, not cached.
}
else
{
// do something sensible (often nothing) if the object's already destroyed
}
Ключевым преимуществом этой идиомы является то, что сильный указатель ограничен блоком if-true, что помогает предотвратить случайное использование неинициализированной ссылки или сохранение сильной ссылки дольше, чем это фактически требуется.