You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.12 18:00:03