在共享指针上看到意外数据
Seeing unexpected data on a shared pointer
我正在尝试将 nlohmann::json
对象转换为 std::shared_ptr<char[]>
。我 运行 遇到一个问题,共享指针内的数据似乎附加了我的原始对象中没有的额外垃圾。
下面的函数并没有尽可能简洁,因为我想展示我在调试器中看到的内容。您看到的注释是该行变量的值。我不明白这个 ÍýýýýÝÝÝÝÝ¡\x4\x1d'ýI
是从哪里来的。我在这里做错了什么?
// Incoming json: {"data":[100]}
std::shared_ptr<char[]> serializeJson(nlohmann::json& d) {
std::string ds = d.dump(); // '{"data":[100]}'
std::shared_ptr<char[]> rd(new char[ds.size() + 1]); // 'ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍýýýýÝÝÝÝÝ¡\x4\x1d'ýI'
ds.copy(rd.get(), ds.size() + 1); // '{"data":[100]}ÍýýýýÝÝÝÝÝ¡\x4\x1d'ýI'
return rd;
}
我相信指针内的数据已被修改,因为当我尝试使用下面的函数反序列化字符串时出现异常。我也已将值附加到此代码段 ...
nlohmann::json deserializeJson(const std::shared_ptr<char[]>& d) {
std::string p = d.get(); // '{"data":[100]}ÍýýýýÝÝÝÝÝû¤¶¯´2'
std::string e = p.substr(p.size()-10); // 'ÝÝÝÝû¤¶¯´2'
nlohmann::json nd = nlohmann::json::parse(p); // kaboom! / Exception
return nd;
}
感谢您的帮助!
问题出在这里:
ds.copy(rd.get(), ds.size() + 1);
std::string::copy 不会复制一个空终止符,所以当你在这里构造一个字符串时:
std::string p = d.get();
您读取了数组末尾并调用了未定义的行为。这可能可以通过使用 std::string
来避免; std::shared_ptr<char[]>
不寻常。
我正在尝试将 nlohmann::json
对象转换为 std::shared_ptr<char[]>
。我 运行 遇到一个问题,共享指针内的数据似乎附加了我的原始对象中没有的额外垃圾。
下面的函数并没有尽可能简洁,因为我想展示我在调试器中看到的内容。您看到的注释是该行变量的值。我不明白这个 ÍýýýýÝÝÝÝÝ¡\x4\x1d'ýI
是从哪里来的。我在这里做错了什么?
// Incoming json: {"data":[100]}
std::shared_ptr<char[]> serializeJson(nlohmann::json& d) {
std::string ds = d.dump(); // '{"data":[100]}'
std::shared_ptr<char[]> rd(new char[ds.size() + 1]); // 'ÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍýýýýÝÝÝÝÝ¡\x4\x1d'ýI'
ds.copy(rd.get(), ds.size() + 1); // '{"data":[100]}ÍýýýýÝÝÝÝÝ¡\x4\x1d'ýI'
return rd;
}
我相信指针内的数据已被修改,因为当我尝试使用下面的函数反序列化字符串时出现异常。我也已将值附加到此代码段 ...
nlohmann::json deserializeJson(const std::shared_ptr<char[]>& d) {
std::string p = d.get(); // '{"data":[100]}ÍýýýýÝÝÝÝÝû¤¶¯´2'
std::string e = p.substr(p.size()-10); // 'ÝÝÝÝû¤¶¯´2'
nlohmann::json nd = nlohmann::json::parse(p); // kaboom! / Exception
return nd;
}
感谢您的帮助!
问题出在这里:
ds.copy(rd.get(), ds.size() + 1);
std::string::copy 不会复制一个空终止符,所以当你在这里构造一个字符串时:
std::string p = d.get();
您读取了数组末尾并调用了未定义的行为。这可能可以通过使用 std::string
来避免; std::shared_ptr<char[]>
不寻常。