Rapidjson中stringRef,SetString的真正含义

 

\u00000\u0004T_\u0000\u0000E html>
 

 

使用rapidjson时出现以上问题,1.不是完整的内容,2.多次转义\


bid.AddMember("adm", rapidjson::StringRef(html_snippet.c_str(),html_snippet.size()), allocator);


stringRef(html_snippet.c_str())一开始以为可能可能是字符串结束标志问题,这种方式会调动C的strlen去查找\0判断字符串结束,而指定字符串长度的size后仍然会有\u00000的乱码出现.

使用另一种方式,未出现此种问题:
Value str_val;
str_val.SetString(html_snippet.c_str(),html_snippet.length(),allocator);
bid.AddMember("adm", str_val, allocator);

等价的方式:ringRef(html_snippet.c_str(),Value().SetString(html_snippet.c_str(),allocator).Move(),allocator)

回去仔细查看手册对比源码,这两种方式的差异是StringRef是引用转移,也就是把指针指向了真正内容所在的内存区域。而第二种方式是值copy的方式,会分配内存把字符串复制一份副本。所以问题的根源是html_snippet 是临时局部变量,在document对象序列成json string是html_snippet局部变量已被析构,故转移的方式指向的内存区域是未知的,导致了\00000的出现。

 

 

你可能感兴趣的:(技术问题,技术总结)