C ++ rapidjson错误:free():下一个大小无效(正常)

时间:2015-05-27 11:54:02

标签: c++ rapidjson

我正在阅读有关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():下一个尺寸无效(正常)

2 个答案:

答案 0 :(得分:0)

此错误与来自C的rapidJson无关,因为某些内容与内存管理有关。 C ++是C语言的继承者,它不会检查有关内存管理的任何内容,因为它应该很快并且会信任你。因此,您所获得的错误不仅会告诉您究竟有什么问题。在你的代码中,你正在使用一个数组,但你没有很好地管理它的边界,仔细检查你正在做什么有关读取和写入无符号数组(更仔细地检查边界)或使用像std :: vector这样的容器那对你而言。看看这里:

http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4027/C-Tutorial-A-Beginners-Guide-to-stdvector-Part-1.htm

答案 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())
  { ...