递归函数中的boost regex smatch就像一个静态变量

时间:2013-06-12 14:55:43

标签: c++ regex boost static

我使用boost :: regex遇到了一个奇怪的行为。

以下函数调用一次(如果使用参数'true'调用)。

void regex_rek(bool recurse)
{
  boost::smatch match;
  if ( recurse )
  {
    std::string txt( "aaa" );
    boost::regex rgx("aaa");
    boost::regex_match(txt, match, rgx );
  }
  else
  {
    std::string txt("bbb");
    boost::regex rgx("bbb");
    boost::regex_match(txt, match, rgx );
  }

  std::cout <<"before: "<< std::string(match[0]) << std::endl;
  if (recurse)
  {
    regex_rek(false);
  }
  std::cout <<"after: "<< std::string(match[0]) << std::endl;

}

这个的输出应该是

before: aaa
before: bbb
after: bbb
after: aaa

但是(对我来说,使用boost-1.48在ubuntu-64bit上运行):

before: aaa
before: bbb
after: bbb
after: bbb

在win64,msvc11,boost-1.53​​上我得到了别的东西:

before: aaa
before: bbb
after: bb
after: aa

没有笑话。这是我的错吗?我在哪里犯了大错?

我发现如果我使用cmatch版本,一切都很好。但这对我来说别无选择,因为我的字符串可能包含0x0

1 个答案:

答案 0 :(得分:2)

smatch不包含匹配的数据副本;相反,它包含指向它的指针。匹配的数据是变量txt,在您调用regex_match后立即超出范围。此时,访问match是未定义的行为,任何事情都可能发生。

txt之前声明match,并在if分支内分配它,它应该可以正常工作。

cmatch版本可能有效,因为它包含指向字符串文字的指针,它永远不会超出范围。