boost :: regex segfaults при использовании захвата - PullRequest
4 голосов
/ 01 июня 2009

Я получаю ошибку seg для простой программы ниже. Похоже, это связано с деструктором 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

Ответы [ 4 ]

4 голосов
/ 01 июня 2009

boost :: regex - один из немногих компонентов boost, который существует не только в заголовочных файлах ... есть библиотечный модуль.

Вероятно, используемая вами библиотека была построена с настройками, отличными от вашего приложения.

Редактировать: Нашел пример сценария с этой известной ошибкой повышения , где повышение должно быть построено с тем же флагом -malign-double, что и ваше приложение.

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

0 голосов
/ 01 ноября 2011

У меня была такая же проблема. Я попробовал решение, опубликованное Дрю Дорманом, но оно не сработало. Затем я обнаружил, что на самом деле связывался с 1,40, но по какой-то причине заголовки были на 1,37. После того, как я загрузил правильные заголовки (1.40), он прекратил segfaulting.

Я заметил это, когда скомпилировал символы отладки -g и запустил обратную трассировку dbg ..

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

0 голосов
/ 01 июня 2009

Вы используете временную переменную, из которой вы хотите получить совпадения. Я думаю, что ваша проблема будет решена, если вместо «abc» вы будете использовать следующее:

string a("abc);
regex_match(a, matches, re.assign("(a)bc"));
0 голосов
/ 01 июня 2009

Какую версию надстройки вы используете?

Я скомпилировал приведенный выше пример с бустом 1.36, и у меня не возникло ошибок seg.

Если у вас есть несколько библиотек наддува, убедитесь, что во время выполнения вы выбираете правильную версию.

Требуется скомпилировать регулярное выражение 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

Вы должны указать расположение буст-файлов include / libs в вашей системе, отметить версию gcc и m (ulti) t (hreaded) в имени библиотеки - это зависит от того, что вы скомпилировали, просто посмотрите в вашей логике boost каталог и выберите одну версию библиотеки регулярных выражений оттуда.

...