真的无法弄清楚'抛出'std :: out_of_range'实例后'终止调用'的原因
std::cerr << std::string(s[0].first, s[0].second) << std::endl;
std::cerr << std::string(e[0].first, e[0].second) << std::endl;
std::cerr << std::string(s[0].first, e[0].second) << std::endl;
上面的代码返回匹配结果的有效字符串
boost::regex start(elementStartTag);
boost::regex end(elementEndTag);
boost::match_results<std::string::const_iterator> s, e;
if(!boost::regex_search(tmpTemplate, s, start)) {
dDebug() << "No start token: " << elementStartTag << " was found in file: " << templatePath();
std::cerr << "No start token: " << elementStartTag << " was found in file: " << templatePath() << std::endl;
return;
}
if(!boost::regex_search(tmpTemplate, e, end)) {
dDebug() << "No end token: " << elementEndTag << " was found in file: " << templatePath();
std::cerr << "No end token: " << elementEndTag << " was found in file: " << templatePath() << std::endl;
return;
}
//std::string::iterator si, ei;
// si = fromConst(tmpTemplate.begin(), s[0].second);
// ei = fromConst(tmpTemplate.begin(), e[0].first);
// std::cerr << std::string(si, ei) << "\t" << ss.str(); // return valid string
std::cerr << std::string(s[0].first, s[0].second) << std::endl;
std::cerr << std::string(e[0].first, e[0].second) << std::endl;
std::cerr << std::string(s[0].first, e[0].second) << std::endl;
std::cerr << "s[0].first - tmpTemplate.begin()\t" << s[0].first - tmpTemplate.begin() << std::endl;
std::cerr << "s[0].first - e[0].second\t" << s[0].first - e[0].second << std::endl;
//tmpTemplate.replace(fi, se, ss.str()); //also throws exeption
tmpTemplate.replace(s[0].first - tmpTemplate.begin(), s[0].first - e[0].second, "test"); // throws exeption
gcc版本:4.7.3如果真的很重要
提升版本:1.52.0
更新:
第一: 下面的等式是错误的[0]。第一 - e [0]。第二个应该是e [0] .second - s [0]。首先 - 我想知道为什么没有人看到这个(我也是) - 但认为这是一个错字,导致s [0] .first - tmpTemplate.begin()无论如何都返回负数。
tmpTemplate定义并初始化为
std::string tmpTemplate= getTemplate();
太棒了 - 就像我说的那样[0] .first - tmpTemplate.begin()返回负数
如果定义了tmpTemplate并将其初始化为
std::string tmpTemplate(getTemplate().data(), getTemplate().length());
一切都很好。
第二
停止提升:: match_results未初始化的废话请阅读regex_search文档,它说:“如果我找不到匹配,则返回false”
第三
std::string tmpTemplate= getTemplate();
和
std::string tmpTemplate(getTemplate().data(), getTemplate().length());
确实不同。
拥有Сonclusion:
以太存储器损坏是在我的代码中出现的地方,我无法用valgrind检测到它,或者是一个不属于我的代码的错误。
答案 0 :(得分:1)
tmpTemplate
,elementStartTag
和elementEndTag
的内容是什么?如果elementEndTag
位于elementStartTag
tmpTemplate
之前,那么您肯定会收到out_of_range
错误。
最后,我建议只使用一个正则表达式,如下所示:
boost::regex matcher( ".*(" + elementStartTag + ")(.*)(" + elementEndTag + ").*");
然后使用boost::regex_match
而不是搜索。这保证了秩序;但是,如果序列中有多个匹配元素,则可能会导致问题。如果这是一个问题:您应该使用:
boost::regex_search( s[1].second, tmpTemplate.end(), e, end )
作为匹配结尾的表达式。