【问题标题】:boost::regex segfaults when using capture使用捕获时的 boost::regex 段错误
【发布时间】:2010-10-30 07:23:57
【问题描述】:

下面的简单程序出现段错误。好像和析构函数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

【问题讨论】:

  • 在我的情况下,它试图从 match_results 销毁 m_subs 向量时访问无效的内存位置

标签: c++ boost-regex


【解决方案1】:

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

当我使用调试符号 -g 编译并运行 dbg 回溯时,我注意到了这一点。

希望对您有所帮助...

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      boost::regex 是 boost 中少数不只存在于头文件中的组件之一……有一个库模块。

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

      编辑:找到了一个带有 this known boost bug 的示例场景,其中 boost 必须使用与您的应用程序相同的 -malign-double 标志构建。

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

      【讨论】:

        【解决方案4】:

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

        我用 boost 1.36 编译了上面的例子,我没有遇到任何段错误。

        如果您有多个 boost 库,请确保在运行时选择正确的版本。

        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 包含/库的位置,注意库名称中 gcc 和 m(ulti) t(hreaded) 的版本 - 这取决于您编译的内容,只需查看您的 boost lib目录并从那里选择一个版本的正则表达式库。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-12
          • 1970-01-01
          • 2020-12-05
          • 2013-01-30
          • 1970-01-01
          相关资源
          最近更新 更多