Выражение: строковый итератор не может быть разыменован при использовании регулярного выражения Boost

Я хочу восстановить все ссылки со страницы, при выполнении этого кода получаю:

Библиотека отладки Microsoft Visual C ++

Ошибка отладки!

Программа: C: \ Users \ Gandalf \ Desktop \ proxy \ Debug \ Proxy.exe Файл: C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC \ include \ xstring Строка: 78

Выражение: строковый итератор не может быть разыменован

Для получения информации о том, как ваша программа может вызвать сбой утверждения, см. Документацию Visual C ++ по утверждениям.

(Нажмите "Повторить", чтобы отладить приложение)

Прервать повторную попытку игнорировать

void Deltacore::Client::get_links() {
boost::smatch matches;
boost::match_flag_type flags = boost::match_default;
boost::regex URL_REGEX("^<a[^>]*(http://[^\"]*)[^>]*>([ 0-9a-zA-Z]+)</a>$");

if(!response.empty()) {

    std::string::const_iterator alfa = this->response.begin();
    std::string::const_iterator omega   = this->response.end();

    while (boost::regex_search(alfa, omega, matches, URL_REGEX))
    {
        std::cout << matches[0];
        //if(std::find(this->Links.begin(), this->Links.end(), matches[0]) != this->Links.end()) {
            this->Links.push_back(matches[0]);
        //}
        alfa = matches[0].second;
    }
}
}

Любая идея?

Добавлен еще код:

        Deltacore::Client client;
    client.get_url(target);
    client.get_links();

            boost::property_tree::ptree props;
            for(size_t i = 0; i < client.Links.size(); i++)
                props.push_back(std::make_pair(boost::lexical_cast<std::string>(i), client.Links.at(i)));

            std::stringstream ss;
            boost::property_tree::write_json(ss, props, false);

            boost::asio::async_write(socket_,
                boost::asio::buffer(ss.str(), ss.str().length()),
                boost::bind(&session::handle_write, this,
                boost::asio::placeholders::error));

заранее спасибо


person Claudiu Claw    schedule 26.07.2012    source источник
comment
Просто попробуйте использовать std :: string :: iterator вместо const_iterator.   -  person Mahesh    schedule 27.07.2012
comment
@Wug Это входит в базовые комплекты C ++, я уверен, что ошибка в моем коде.   -  person Claudiu Claw    schedule 27.07.2012
comment
@Mahesh boost :: regex_search почему-то заставляет меня использовать std :: string :: const_iterator   -  person Claudiu Claw    schedule 27.07.2012
comment
Может быть, он хочет end () - 1 или что-то в этом роде. Утверждение верно? (Он говорит, что это так.) Какое значение имеет строка до того, как вы получите итераторы?   -  person Wug    schedule 27.07.2012
comment
этот ›ответ представляет собой полный HTML-вывод страницы (я получаю его с помощью cURL).   -  person Claudiu Claw    schedule 27.07.2012
comment
Гарантировано ли, что matches[0].second будет итератором исходной строки? Вы должны иметь возможность заставить отладчик сообщать вам, где в вашем коде происходит подтверждающий вызов, кстати.   -  person Alan Stokes    schedule 27.07.2012
comment
Я добавил фактическое использование функции. Поскольку отладчик не слишком полезен. Ошибка может быть вызвана оттуда.   -  person Claudiu Claw    schedule 27.07.2012
comment
Странно то, что сбой случается случайно. Если я снова выполню код, он заработает.   -  person Claudiu Claw    schedule 27.07.2012
comment
@Claudiu: Это не странно, звучит как ванильный UB. Каковы фактические данные в response при запуске регулярного выражения?   -  person ildjarn    schedule 27.07.2012
comment
если (! response.empty ()) {глупая ошибка программистов, то это- ›ответ   -  person Claudiu Claw    schedule 27.07.2012
comment
this-> обычно не является обязательным. Его использование или пропуск - это стилевое решение, а не ошибка.   -  person aschepler    schedule 27.07.2012
comment
@aschepler спасибо, я этого не знал.   -  person Claudiu Claw    schedule 27.07.2012
comment
Кажется, что ошибка срабатывает после выполнения boost :: asio :: async_write. Он успешно отправляет строку, а затем аварийно завершает работу.   -  person Claudiu Claw    schedule 27.07.2012


Ответы (2)


Проблема в этой строке:

boost::asio::buffer(ss.str(), ss.str().length())

str() возвращает временный std::string объект, поэтому вы фактически аннулируете буфер, как только вы его создаете - ванильный UB, как я прокомментировал. ; -]

Токен ссылка на документацию:

Буфер становится недействительным из-за любой неконстантной операции, вызываемой для данного строкового объекта.

Конечно, уничтожение строки квалифицируется как неконстантная операция.

person ildjarn    schedule 26.07.2012
comment
Это на самом деле исправило это. Спасибо. Сейчас 2 часа ночи, и я пишу плохой код: / - person Claudiu Claw; 27.07.2012

Пропустив лекцию об использовании регулярных выражений для анализа HTML (и о том, как вам действительно не следует ...), ваше регулярное выражение не выглядит так, как будто оно будет работать так, как вы намеревались. Это твое:

"^<a[^>]*(http://[^\"]*)[^>]*>([ 0-9a-zA-Z]+)</a>$"

Первый класс символов будет жадным и съест ваш http и последующие части. Вы хотите добавить вопросительный знак, чтобы он не был жадным.

"^<a[^>]*?(http://[^\"]*)[^>]*>([ 0-9a-zA-Z]+)</a>$"

Это могло быть связано, а могло и не быть связано с исключением.

person VolatileRig    schedule 26.07.2012