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

C++可变参数日志系统字符串被覆盖、出现乱码问题排查求助

问题根因

你遇到的字符串覆盖+乱码是典型的野指针/悬挂指针问题,核心原因有两个:

  • info结构体的text成员是裸指针const char*,本身不存储字符串内容,只记录字符串的内存地址
  • add_log_messasge方法里的fmsg是栈上分配的局部字符数组,当方法执行结束后,这块栈内存会被系统自动回收复用,你存在info里的指针指向的就是已经失效的内存地址

后续再调用add_log_messasge时,新的fmsg还是会分配在同一块栈内存区域,所以旧的info里的指针指向的内容会被新的日志内容覆盖,内存释放后的随机值也会导致出现异常字符。

修复方案

把info结构体的text成员类型换成std::string即可,std::string会自动拷贝存储字符串内容,生命周期和info实例绑定,不会随栈内存释放失效:

// 修改后的info结构体
struct info {
    std::string text;
    float time;
    color col;
    info(std::string ntext, float ntime, color ncol) : text(std::move(ntext)), time(ntime), col(ncol) { }
};

其他代码不需要额外修改,push_back(info(fmsg, 10.0f, col))里的fmsg会自动隐式转换为std::string,字符串内容会被完整拷贝存储。

额外逻辑修正

你当前限制日志条数的逻辑是错误的:

if (this->info_list.size() > 12)
    this->info_list.pop_back();

pop_back()会删除刚插入的最新一条日志,如果你想保留最新的12条、删除最旧的日志,应该改成:

if (this->info_list.size() > 12)
    this->info_list.erase(this->info_list.begin());

内容的提问来源于stack exchange,提问作者josh koil

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 21:54:03