2009-05-31 32 views
4

对于下面的简单程序,我得到一个段错误。它似乎与析构函数match_results有关。boost :: regex使用捕获时的段错误

#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的矢量 – 2014-12-10 10:45:06

回答

4

的boost ::正则表达式是不头文件单独存在提升的几个组成部分之一...有一个库模块。

您正在使用的库很可能是使用与您的应用程序不同的设置构建的。

编辑:找到一个示例场景与this known boost bug,在提升必须用相同的-malign-double标志作为您的应用程序来构建。

这是几种可能的情况之一,其中您的boost库不会与您的应用程序具有二进制兼容性。

0

您使用的是哪种版本的boost?

我编译了上面的例子boost 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 

您将指向升压的位置包括/库上你的系统,请注意库名称中的gcc和m(ulti)t(hreaded)的版本 - 这取决于你编译的内容,只需查看你的boost lib目录并选择一个从那里的正则表达式库的版本。

0

您正在使用您想要获得匹配的临时变量。我认为,你的问题将得到解决,如果代之以“abc”,你将使用以下内容:

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

我遇到了同样的问题。我尝试了Drew Dormann发布的解决方案,但没有奏效。然后我发现我实际上是与1.40链接的,但由于某些原因,标题为1.37。一旦我下载了正确的标题(1.40),它就停止了分段。

我注意到它时,我曾与调试符号-g编译和运行DBG回溯..

希望帮助...