我正在阅读有关JavaScript的数据,并将Jsonstring传递给网络服务器:{"data_size":500, "array":[0,0,0,0,..,0,0]}
。数组中的数字可以是介于0到4294967295之间的任何数字。
在Mongoose网络服务器上,我使用lib rapidjson来处理Jsonstring。因此,我创建了一个文档d 并从" jsonstring"中读取值。使用这个进入uint32_t数组:
#include "rapidjson/document.h"
int i_data_size=0;
Document d;
conn->content[conn->content_len]=0; //to zero terminate
if (d.Parse(conn->content).HasParseError())
{
//Error
}
else
{
Value& s = d["data_size"];
i_data_size=s.GetInt();
uint32_t *Data=NULL;
Data=new uint32_t[i_data_size];
Value& a = d["array"];
for(SizeType i=0;i<a.Size();i++)
{
Data[i]=a[i].GetUint();
}
}
conn->content
包含json char *。
当我发送时:{"data_size":500, "array":[0,0,0,0,..,0,0]}
一切正常。但有时候,不是每次,当一个数字变得更大时,就像这样:
{"data_size":500, "array":[123,222,0,0,..,0,0]}
我收到错误:
free():下一个尺寸无效(正常)
答案 0 :(得分:0)
此错误与来自C的rapidJson无关,因为某些内容与内存管理有关。 C ++是C语言的继承者,它不会检查有关内存管理的任何内容,因为它应该很快并且会信任你。因此,您所获得的错误不仅会告诉您究竟有什么问题。在你的代码中,你正在使用一个数组,但你没有很好地管理它的边界,仔细检查你正在做什么有关读取和写入无符号数组(更仔细地检查边界)或使用像std :: vector这样的容器那对你而言。看看这里:
答案 1 :(得分:0)
解决了问题!
从边界写出零导致错误:
conn->content[conn->content_len]=0; //to zero terminate
使用字符串解决问题:
string json="";
json = string(conn->content);
json=json.substr(0,conn->content_len);
if (d.Parse(json.c_str()).HasParseError())
{ ...