我使用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
。
答案 0 :(得分:2)
smatch
不包含匹配的数据副本;相反,它包含指向它的指针。匹配的数据是变量txt
,在您调用regex_match
后立即超出范围。此时,访问match
是未定义的行为,任何事情都可能发生。
在txt
之前声明match
,并在if分支内分配它,它应该可以正常工作。
cmatch
版本可能有效,因为它包含指向字符串文字的指针,它永远不会超出范围。