Glib::Regex匹配返回乱码但等效底层C函数运行正常问题排查
Glib::Regex调用match后fetch返回乱码问题原因及解决方案
问题根因
- 核心是输入字符串生命周期短于Glib::MatchInfo对象导致的悬空指针访问:
你调用regEx->match(fileName, match)时传入的是std::string类型,Glibmm的C++封装会隐式生成一个临时Glib::ustring对象作为匹配输入,Glib::MatchInfo内部不会拷贝输入字符串,只会持有它的指针。临时Glib::ustring在match调用结束后就被销毁,后续调用match.fetch()时访问的是已经释放的内存,所以出现乱码。
直接调用C API的写法中,传入的是fileName.c_str(),这个指针在整个testGetPos函数生命周期内都是有效的,所以匹配结果可以正常获取。
正确C++封装写法
只要保证匹配用的输入字符串生命周期覆盖到所有fetch操作执行完成即可,示例代码:
void testGetPos(std::string fileName){ auto regEx = Glib::Regex::create( "^sprite_[0-9]+__x(-?[0-9]+)_y(-?[0-9]+)\\.tif$", Glib::REGEX_CASELESS ); Glib::ustring inputStr(fileName); // 提前构造生命周期覆盖全函数的Glib::ustring Glib::MatchInfo match; if(!regEx->match(inputStr, match)){ return; // 原代码中的continue在非循环结构中是语法错误,此处改为return } if(!match.matches()){ return; } auto posX = match.fetch(1); auto posY = match.fetch(2); // ... Use posX and posY } int main(){ testGetPos("sprite_000__x-28_y-32.tif"); }
额外注意项
- 正则表达式里的
.转义在C++字符串里需要写两个反斜杠\\.,否则会被识别为普通字符转义,不符合正则匹配规则。 - 原代码中
Glib::Regex::create调用后缺少分号,属于语法错误,注意补全。
内容的提问来源于stack exchange,提问作者Ben Jaguar Marshall
相关产品推荐
相关产品推荐

