我知道。Xpressive 在这里(可能)没有错,但我付出了很多努力来寻找内存泄漏,我不得不调整代码布局以修复出血。
有人可以向我解释为什么布局的变化修复了它吗?我不明白为什么(正确/改进)使用“static const”可以修复泄漏。
顺便说一句,泄漏发生在 MIP 内核上,使用 boost 版本 1.49,并与 GCC 4.3.3 交叉编译。
原始“筛子”代码:
// source.cpp
#include <boost/...
cregex token = keep(+set[ alnum|'!'|'%'|'_'|'*'|'+'|'.'|'\''|'`'|'~'|'-']);
cregex more = ...
bool foo(const char * begin, const char * end, size_t& length, std::string& dest)
{
mark_tag name_t(1);
cregex regx = bos >>
icase("name:") >>
(name_t= token) >> eos;
cmatch what;
bool ok = regex_search( begin, end, what, regx );
...
return ok;
}
修复了“无泄漏”代码:
// header.hpp
#include <boost/...
class Xpr {
public:
static const cregex token;
static const cregex more;
};
// source.cpp
#include "header.hpp"
const cregex Xpr::token = keep(+set[ alnum|'!'|'%'|'_'|'*'|'+'|'.'|'\''|'`'|'~'|'-']);
const cregex Xpr::more = ...
bool foo(const char * begin, const char * end, size_t& length, std::string& dest)
{
mark_tag name_t(1);
static const cregex regx = bos >>
icase("name:") >>
(name_t= Xpr::token) >> eos;
cmatch what;
bool ok = regex_search( begin, end, what, regx );
...
return ok;
}
每次调用 foo! 时似乎都会发生泄漏!