Могу ли я получить необработанный указатель от boost's weak_ptr? - PullRequest
6 голосов
/ 17 мая 2010

Можно ли получить необработанный указатель от boost :: weak_ptr? Boost's shared_ptr имеет метод get () и оператор «->». Есть ли какое-то объяснение тому, что weak_ptr не имеет такой же функциональности?

Ответы [ 3 ]

16 голосов
/ 17 мая 2010

A weak_ptr содержит не принадлежащую ссылку, поэтому объект, на который она ссылается, может больше не существовать. Было бы опасно использовать необработанный указатель, содержащий weak_ptr.

Правильный подход заключается в повышении weak_ptr до shared_ptr с использованием weak_ptr::lock() и получении указателя от него.

Документация Boost weak_ptr объясняет, почему было бы небезопасно предоставлять функциональность get() как часть weak_ptr, и содержит примеры кода, которые могут вызвать проблемы.

3 голосов
/ 14 февраля 2012

Это старый вопрос, и принятый ответ хорош, поэтому я не решаюсь опубликовать другой ответ, но одна вещь, которая, по-видимому, отсутствует, является хорошим примером идиоматического использования:

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, что помогает предотвратить случайное использование неинициализированной ссылки или сохранение сильной ссылки дольше, чем это фактически требуется.

2 голосов
/ 17 мая 2010

Прежде чем получить необработанный указатель, сначала нужно вывести shared_ptr из weak_ptr.

Вы можете вызвать lock , чтобы получить shared_ptr или конструктор shared_ptr:

boost::weak_ptr<int> example;
...

int* raw = boost::shared_ptr<int>(example).get();
...