C ++: Почему разыменовывается этот векторный итератор segfault? - PullRequest
2 голосов
/ 07 марта 2012
void insert_string( std::vector<std::string> & strings, const std::string &s )
{

    std::vector<std::string>::iterator it=lower_bound(strings.begin(),strings.end(),s);
    if(strings.size()>0) std::cout<<*it<<" is found\n"; // ****
    strings.insert(it,s);
}

При попытке использовать эту функцию первая вставка проходит нормально. Вторая вставка выведет «[firststring] is found» и затем segfault. Если я закомментирую строку if / cout, я могу повторно позвонить, и никаких ошибок не произойдет.

Я также попытался сделать что-то вроде std::string tmp=*it;, которое затем приведет к segfault в этой строке. Хотя печать не так уж и сложна, я действительно пытаюсь проверить, совпадает ли строка в позиции, найденной lower_bound, со строкой, которую пытаются вставить (т. Е. if(*it==s), которая просто как два приведенных выше примера).

Что мне здесь не хватает?

Спасибо!

1 Ответ

6 голосов
/ 07 марта 2012

Проверьте условие, если it == strings.end(), если оно не распечатано.Это может вызвать проблему.Вы уверены, что строка, которую вы пытаетесь проверить, находится в векторе строк?

...