Тестирование, если shared_ptr равно NULL
У меня есть следующий фрагмент кода:
std::vector< boost::shared_ptr<Foo> >::iterator it;
it = returnsAnIterator();
// often, it will point to a shared_ptr that is NULL, and I want to test for that
if(*it)
{
// do stuff
}
else // do other stuff
Я правильно тестирую? Документы boost говорят, что shared_ptr может быть неявно преобразован в bool, но когда я запускаю этот код, он segfaults:
Program received signal SIGSEGV, Segmentation fault.
0x0806c252 in boost::shared_ptr<Foo>::operator Foo*
boost::shared_ptr<Foo>::* (this=0x0)
at /usr/local/bin/boost_1_43_0/boost/smart_ptr/detail/operator_bool.hpp:47
47 return px == 0? 0: &this_type::px;
Ответы
Ответ 1
Да, вы его правильно тестируете.
Однако ваша проблема, скорее всего, вызвана разыменованием недействительного итератора. Убедитесь, что returnsAnIterator()
всегда возвращает итератор, который не является vector.end()
, и вектор не изменяется между ними или пустым.
Ответ 2
Да, приведенный выше код верен. shared_ptr
может быть неявно преобразован в bool для проверки нулевого значения.
У вас есть ваша функция returnAnIterator()
, которая возвращает недействительный итератор. Вероятно, он возвращает end()
для некоторого контейнера, который один за концом контейнера, и поэтому не может быть разыменован, как вы делаете с *it
.