проверка, является ли shared_ptr NULL - PullRequest
11 голосов
/ 08 августа 2010

У меня есть следующий фрагмент кода:

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 может быть неявно преобразован в bool, но когда я запускаю этот код, он вызывает ошибку:

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;

Ответы [ 2 ]

8 голосов
/ 08 августа 2010

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

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

7 голосов
/ 08 августа 2010

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

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

...