Можно ли получить необработанный указатель от boost :: weak_ptr? Boost shared_ptr имеет метод get() и «->». Есть ли какое-то обоснование для weak_ptr, не имеющего такой же функциональности?Могу ли я получить необработанный указатель от boost_ptr boost?
ответ
A weak_ptr
содержит ссылку, не относящуюся к собственности, поэтому объект, к которому он относится, может не существовать больше. Было бы опасно использовать необработанный указатель, удерживаемый weak_ptr
.
Правильный подход заключается в продвижении weak_ptr
в shared_ptr
с использованием weak_ptr::lock()
и получения указателя.
Boost weak_ptr
documentation объясняет, почему было бы небезопасно обеспечивать функциональность get()
как часть weak_ptr
, а также примеры кода, которые могут вызвать проблемы.
Сначала вы должны получить shared_ptr из weak_ptr перед тем, как овладеть необработанным указателем.
Вы можете позвонить lock получить shared_ptr, или shared_ptr конструктор:
boost::weak_ptr<int> example;
...
int* raw = boost::shared_ptr<int>(example).get();
Как написано, это небезопасно - вы можете остаться с обвисшим указателем, если объект будет удален при уничтожении временного 'shared_ptr'. Вы должны держать 'shared_ptr' до тех пор, пока используете необработанный указатель. –
Это старый вопрос, и принятый ответ хороший, поэтому я не решаюсь опубликовать еще один ответ, но одна вещь, которая кажется отсутствует хороший идиоматических пример использования:
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
}
ключевым преимуществом этой идиомы является то, что сильный указатель области видимости КРП-истинный блок, который помогает предотвратить случайное использование, не инициализирован ссылки, или хранение сильная ссылка на длинные чем это действительно необходимо.
- 1. Необработанный указатель функции от связанного метода
- 2. Могу ли я написать функтор C++, который принимает как необработанный указатель, так и умный указатель?
- 3. Как я могу получить необработанный пакет от клиента?
- 4. Scoped Pointer in Boost: что означает необработанный указатель?
- 5. boost python - как отправить необработанный указатель на функцию python>
- 6. Где я могу получить необработанный файл YUV?
- 7. Правильно ли возвращать необработанный указатель из unique_ptr?
- 8. Необработанный указатель внутри std :: make_shared
- 9. Singleton, shared_ptr, необработанный указатель или другой указатель?
- 10. Функция библиотеки возвращает необработанный указатель, и я хочу использовать смарт-указатель
- 11. Может ли необработанный указатель быть передан функции шаблона, ожидающей итератора?
- 12. C++ - необработанный указатель на shared_ptr
- 13. boost pool: могу ли я отучить его от системы повышения?
- 14. Зачем использовать boost :: optional, когда я могу вернуть указатель
- 15. Могу ли я получить CGColor от CGGradient?
- 16. Как я могу получить числовые привязки boost?
- 17. Могу ли я настроить скрипт настройки boost?
- 18. Как я могу получить значение из boost :: thread?
- 19. Wcf получить необработанный запрос от операции
- 20. Получить необработанный запрос от клиента NEST
- 21. Как я могу использовать Boost?
- 22. Могу ли я получить указатель на текущее значение итератора
- 23. Могу ли я получить возвращаемое значение как указатель на константу
- 24. Могу ли я получить указатель на значение карты в golang?
- 25. получить «необработанный» запрос \ отклик от прокси MITM
- 26. Boost python, сравнить исходный указатель на управляемый указатель?
- 27. Как я могу получить необработанный URL-адрес канала iheartradio.
- 28. Могу ли я регистрировать необработанный корпус запроса видеомагнитофона?
- 29. Могу ли я привязать необработанный узел html в Ember/handlebars?
- 30. Могу ли я просмотреть необработанный запрос, сделанный мыльным вызовом wcf
В этом случае вы можете остаться с обвисшим указателем, если вы получите необработанный указатель на 'shared_ptr', который впоследствии будет уничтожен ... в случае Multithread вы даже можете остаться с висящим указателем в начале код 'if (! weak.expired()) weak-> run();' поскольку объект, на который указывает, может быть уничтожен между тестом и выполнением метода (я полагаю, что сам метод правильно синхронизирован) ... –
@Matthieu: конечно вы * можете *, так же как вы можете остаться с обвисшим указателем, если вы явно «удаляете» объект, но держите указатель на него. Суть в том, что нужно продвигать 'weak_ptr' в' shared_ptr', заключается в том, что он рекомендует вам правильно использовать использование необработанного указателя, следуя правилам, которые обычно используются для 'shared_ptr :: get'. Не было бы эквивалентного способа правильно охватить использование необработанного указателя, полученного непосредственно из 'weak_ptr'. –