C++ rapidjson Error: free(): invalid next size (normal)
C++ rapidjson Error: free(): invalid next size (normal)
我正在 JavaScript 上读取数据并将 Jsonstring 像这样传递给网络服务器:{"data_size":500, "array":[0,0,0,0,..,0,0]}
。数组中的数字可以是 0 到 4294967295 之间的任何数字。
在 Mongoose 网络服务器上,我使用 lib rapidjson 来处理 Jsonstring。因此,我创建了一个 Document 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(): 下一个尺寸无效(正常)
此错误与 rapidJson 无关,它来自 C,显示内存管理出现问题。 C++ 是 C 语言的继承者,不会检查任何关于内存管理的内容,因为它应该很快,而且它会信任你。正因为如此,您得到的错误不会只是告诉您到底出了什么问题。在你的代码中,你正在使用一个数组,但你没有很好地管理它的边界,仔细检查你在读写该无符号数组方面所做的事情(更仔细地检查边界)或使用像 std::vector 这样的容器为你做那件事。看看这里:
问题解决了!
在边界外写入零导致错误:
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())
{ ...
我正在 JavaScript 上读取数据并将 Jsonstring 像这样传递给网络服务器:{"data_size":500, "array":[0,0,0,0,..,0,0]}
。数组中的数字可以是 0 到 4294967295 之间的任何数字。
在 Mongoose 网络服务器上,我使用 lib rapidjson 来处理 Jsonstring。因此,我创建了一个 Document 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(): 下一个尺寸无效(正常)
此错误与 rapidJson 无关,它来自 C,显示内存管理出现问题。 C++ 是 C 语言的继承者,不会检查任何关于内存管理的内容,因为它应该很快,而且它会信任你。正因为如此,您得到的错误不会只是告诉您到底出了什么问题。在你的代码中,你正在使用一个数组,但你没有很好地管理它的边界,仔细检查你在读写该无符号数组方面所做的事情(更仔细地检查边界)或使用像 std::vector 这样的容器为你做那件事。看看这里:
问题解决了!
在边界外写入零导致错误:
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())
{ ...