2010-08-07 5 views
11

Я следующий фрагмент кода:тестирование, если 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 

Правильно ли я тестирование? Подпиточные документы говорят о том, что shared_ptr может быть неявно преобразован в логическое значение, но когда я запускаю этот код он возвращает ошибку сегментации:

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; 

ответ

7

Да, вы правильно тестирование.

Ваша проблема, скорее всего, вызвана разыменованием недействительного итератора. Убедитесь, что returnsAnIterator() всегда возвращает итератор, который не является vector.end(), и вектор не изменяется между ними или пустым.

+0

Итератор - это 'vector.begin()', поэтому, видимо, я тестировал неправильную вещь. Спасибо за вашу помощь. – Max

8

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

Проблема у вас есть, ваша функция returnAnIterator() возвращает недействительный итератор. Вероятно, он возвращает end() для некоторого контейнера, который является минусом в конце контейнера и, следовательно, не может быть разыменован как вы делаете с *it.

Смежные вопросы