2009-05-31 8 views
4

아래의 간단한 프로그램에 대한 seg 오류가 발생합니다. 그것은 소멸자 match_results와 관련이있는 것 같습니다.boost :: regex segfaults 때 캡처를 사용

#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; 
} 

편집 : 나는 부스트를 1.39

+0

m_subs을 파괴 할 때 잘못된 메모리 위치를 액세스하려고 match_results의 벡터 –

답변

4

부스트 :: 정규식을 사용하고하는 헤더 파일에 단독으로 존재하지 않는 부스트의 몇 가지 구성 요소 중 하나입니다 ... 라이브러리 모듈이있다.

사용중인 라이브러리가 응용 프로그램과 다른 설정으로 작성되었을 수 있습니다.

편집 :this known boost bug으로 예제 시나리오를 찾았습니다. 여기서 부스트는 응용 프로그램과 동일한 -malign-double 플래그로 작성해야합니다.

이것은 부스트 ​​라이브러리가 응용 프로그램과 바이너리 호환성을 가지지 않는 몇 가지 가능한 시나리오 중 하나입니다.

0

어떤 버전의 부스트를 사용하고 있습니까?

위의 예를 부스트 1.36으로 컴파일했는데 seg faults가 발생하지 않습니다.

여러 개의 부스트 라이브러리가있는 경우 런타임에 올바른 버전을 선택해야합니다. 에/libs와

LD_LIBRARY_PATH=/lib/boost-1_36_0 ./x 

당신은 부스트의 위치를 ​​가리 것이다은 다음과 같습니다

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 

실행할 :

부스트 정규식 내 경우에는 라이브러리 -lboost_regex-gcc_whatever-is-your- version

에 대해 컴파일 할 필요 당신의 시스템은 라이브러리 이름에 gcc와 m (ulti) t (hreaded)의 버전을 기록합니다 - 컴파일 한 것에 달려 있습니다. 단지 boost lib 디렉토리를보고 하나 선택하십시오 거기에서 regex 라이브러리의 버전.

0

일치 항목을 가져올 임시 변수를 사용하고 있습니다. 제 생각에는 문제가 해결 될 것입니다. 다음과 같이 사용하는 경우 "abc"대신 다음을 사용하십시오.

string a("abc); 
regex_match(a, matches, re.assign("(a)bc")); 
0

동일한 문제가있었습니다. Drew Dormann이 게시 한 솔루션을 시도했지만 작동하지 않았습니다. 그 다음 나는 내가 실제로 1.40과 연결되었다는 것을 발견했다. 그러나 어떤 이유에서 헤더는 1.37이었다. 일단 올바른 헤더 (1.40)를 다운로드하면 segfaulting이 중지됩니다. 도움이 내가 디버깅 기호 -g 컴파일하고 DBG 백 트레이스를 실행했을 때 나는 그것을 발견

..

희망 ... 내 경우

관련 문제