boost::regex segfaults при использовании захвата
-
06-09-2019 - |
Вопрос
Я получаю ошибку сегмента для простой программы ниже.Похоже, это связано с деструктором match_results.
#include <iostream>
#include <vector>
#include <string>
#include <boost/regex.hpp>
using namespace std;
int main(int argc, char *argv)
{
boost::regex re;
boost::cmatch matches;
boost::regex_match("abc", matches, re.assign("(a)bc"));
return 0;
}
редактировать:Я использую Boost 1.39.
Решение
boost::regex — один из немногих компонентов boost, который существует не только в заголовочных файлах… есть библиотечный модуль.
Вполне вероятно, что используемая вами библиотека была построена с настройками, отличными от настроек вашего приложения.
Редактировать: Нашел пример сценария с эта известная ошибка ускорения, где наддув должен быть построен с тем же -malign-double
пометить как ваше приложение.
Это один из нескольких возможных сценариев, когда ваша библиотека Boost не будет иметь двоичной совместимости с вашим приложением.
Другие советы
Какую версию буста вы используете?
Я скомпилировал приведенный выше пример с помощью Boost 1.36 и не обнаружил никаких ошибок сегментации.
Если у вас есть несколько библиотек повышения, убедитесь, что во время выполнения вы выбираете правильную версию.
Регулярное выражение Boost необходимо скомпилировать с библиотекой -lboost_regex-gcc_whatever-is-your- version
В моем случае:
g++ -c -Wall -I /include/boost-1_36_0 -o main.o main.cpp
g++ -Wall -I /include/boost-1_36_0 -L/lib/boost-1_36_0 -lboost_regex-gcc33-mt main.o -o x
выполнить:
LD_LIBRARY_PATH=/lib/boost-1_36_0 ./x
Вы должны указать расположение boost include/libs в вашей системе, отметить версию gcc и m(ulti) t(hreaded) в имени библиотеки - это зависит от того, что вы скомпилировали, просто посмотрите в каталоге boost lib и выберите одна версия библиотеки регулярных выражений оттуда.
Вы используете временную переменную, из которой хотите получить совпадения.Я думаю, что ваша проблема будет решена, если вместо «abc» вы будете использовать следующее:
string a("abc);
regex_match(a, matches, re.assign("(a)bc"));
У меня была та же проблема.Я попробовал решение, опубликованное Дрю Дорманном, но оно не сработало.Потом я обнаружил, что на самом деле я ставил ссылку на 1.40, но по какой-то причине заголовки были для 1.37.Как только я загрузил правильные заголовки (1.40), сбои в сегменте прекратились.
Я заметил это, когда компилировал символы отладки. -g
и запустите обратную трассировку dbg..
Надеюсь, это поможет...