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
相关产品推荐
相关产品推荐

