Сбой утверждения С++ при использовании библиотеки регулярных выражений boost

Я только что установил boost lib и visual studio на свой новый ноутбук.

Я получаю следующую ошибку при попытке запустить свой код:

Assertion failed: r != 0, file libs\regex\build\..\src\w32_regex_traits.cpp, line 125

Ошибка возникает при запуске в 32-битной отладке, но работает при использовании выпуска вместо отладки. Это мой фрагмент:

#include <iostream>
#include <boost/regex.hpp>
int main()
{
     boost::regex("hello word", boost::regex::icase);
}

Я попытался переустановить VS2019 и библиотеку boost, но проблема не устранена.

Любые идеи, что может быть причиной ошибки?


person cdo-dev    schedule 03.07.2020    source источник
comment
Я попытался переустановить VS2019 и Boost lib — нет необходимости переустанавливать компиляторы или библиотеки. Ошибка assertion, а не сбой. Поскольку это утверждение, библиотека точно знает, почему было дано утверждение. Все, что вам нужно было сделать, это отладить и посмотреть, где происходит утверждение и почему оно было дано. Как исправить проблему — это отдельная история, но для этой проблемы переустановка компиляторов, библиотек и т. д. была совершенно не нужна.   -  person PaulMcKenzie    schedule 04.07.2020


Ответы (2)


Утверждение здесь:

#ifndef BOOST_NO_ANSI_APIS
   int r = ::LCMapStringA(this->m_locale, LCMAP_LOWERCASE, char_map, 1 << CHAR_BIT, this->m_lower_map, 1 << CHAR_BIT);
   BOOST_ASSERT(r != 0);
#else

Похоже, функция LCMapStringA не работает .

Эта функция возвращает 0, если она не удалась. Чтобы получить расширенную информацию об ошибке, приложение может вызвать GetLastError, который может вернуть один из следующих кодов ошибки:

  • ERROR_INSUFFICIENT_BUFFER. Предоставленный размер буфера был недостаточно большим или был неправильно установлен в NULL.
  • ERROR_INVALID_FLAGS. Значения, предоставленные для флагов, недействительны.
  • ERROR_INVALID_PARAMETER. Любое из значений параметра было недопустимым.

Я не думаю, что эти условия можно игнорировать. Они могут привести к неопределенному поведению. Итак, возможно, вы можете использовать отладчик, чтобы получить значение GetLastError в тот момент, когда ему не удалось получить дополнительную информацию.

В зависимости от того, какую неудачу вы

  • исправить конфигурацию вашей системы (возможно, отсутствует поддержка локали?)
  • исправьте свой ввод (возможно, ваш ввод содержит неверную кодировку)
  • сообщить об ошибке разработчикам Boost (в случае, если есть проблема с размером буфера, которая не является задокументированным ограничением)
person sehe    schedule 03.07.2020

После изменения регионального формата с английского (XXXX) региона на английский (США) проблема была решена.

person cdo-dev    schedule 05.07.2020