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

C++字符数组转字符串长度超1000时数据损坏问题求助

问题排查结论

根因定位

问题出在JSONSerDes::serialize方法的返回逻辑,你拿到的serializedData是悬垂指针:

  • dumps(d)执行后生成的是临时boost::python::str对象
  • 你通过extract<const char*>拿到的字符指针,指向该临时对象内部的字符存储
  • serialize函数返回后,临时str对象自动析构,对应的内部字符内存被回收
  • 后续访问serializedData属于未定义行为

短场景下运行正常是小字符串优化(SSO)的副作用:短字符串通常存储在栈内存,即便对象析构,栈内存未被覆盖时读取结果仍符合预期;长字符串存储在堆内存,析构后内存立即被回收复用,就会出现你观察到的乱码。

修复方案

推荐方案:修改serialize返回类型为std::string

直接将序列化结果拷贝到std::string中返回,从根源避免生命周期问题:

std::string JSONSerDes::serialize(PyObject * pyJson) {
    boost::python::object d = boost::python::extract<boost::python::object>(pyJson);
    return boost::python::extract<std::string>(dumps(d));
}

对应调整上层调用逻辑,需要传const char*时调用返回string的c_str()方法即可。

可选优化:简化JSONContainer实现

你当前的JSONContainer无需手动管理nlohmann::json的堆内存,直接存储栈对象即可:

class JSONContainer {
public:
    explicit JSONContainer(const char* const json) : _json(nlohmann::json::parse(json)) {}

    nlohmann::json& j() {
        return _json;
    }

private:
    nlohmann::json _json;
};

内容的提问来源于stack exchange,提问作者Tyler Weiss

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.04 18:27:02