参考:https://www.it610.com/article/1305226361702486016.htm
错误用法
std::vector<std::string >vec{"1","2","3","4","5"};
const char * in;
rapidjson::Document document;
if (document.Parse<0>(in).HasParseError())
{
return false;
}
int num = 1;
for (auto it : vec)
{
//此处声明一个临时变量
std::string deptName = "str" + std::to_string(num);
document.AddMember(rapidjson::StringRef(deptName.c_str()), rapidjson::StringRef(vec[num - 1].c_str(),
vec[num - 1].size()), document.GetAllocator());
num++;
}
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
document.Accept(writer);
std::string out = buffer.GetString();
正确用法
std::vector<std::string >vec{"1","2","3","4","5"};
const char * in;
rapidjson::Document document;
if (document.Parse<0>(in).HasParseError())
{
return false;
}
int num = 1;
//临时变量的生命周期和rapidjson::Document一样
std::string deptName;
for (auto it : vec)
{
deptName = "str" + std::to_string(num);
document.AddMember(rapidjson::StringRef(deptName.c_str()), rapidjson::StringRef(vec[num - 1].c_str(),
vec[num - 1].size()), document.GetAllocator());
num++;
}
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
document.Accept(writer);
std::string out = buffer.GetString();
正确用法二
std::vector<std::string >vec{"1","2","3","4","5"};
const char * in;
rapidjson::Document document;
if (document.Parse<0>(in).HasParseError())
{
return false;
}
int num = 1;
rapidjson::Document::AllocatorType& allocator = document.GetAllocator();
for (auto it : vec)
{
std::string deptName = "str" + std::to_string(num);
document.AddMember(rapidjson::Value().SetString(deptName.c_str(), allocator).Move(), rapidjson::Value().SetString(vec[num - 1].c_str(), allocator).Move(),
allocator);
num++;
}
rapidjson::StringBuffer buffer;
rapidjson::Writer<rapidjson::StringBuffer> writer(buffer);
document.Accept(writer);
std::string out = buffer.GetString();
原因:
rapidjson::StringRef 是浅拷贝,使用的std::string生命周期结束后就失效了