Rapidjson中stringRef,SetString的真正含义

 

\u00000\u0004T_\u0000\u0000E html><html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\">
 

 

使用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的出现。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值