boost::regex segfaults при использовании захвата

StackOverflow https://stackoverflow.com/questions/933143

  •  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..

Надеюсь, это поможет...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top