0

我正在阅读有关 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]} 一切正常。但有时,不是每次,当 a 数字变大时,像这样: {"data_size":500, "array":[123,222,0,0,..,0,0]}

我得到错误:

free():下一个尺寸无效(正常)

4

2 回答 2

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

于 2015-05-27T13:53:48.460 回答
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())
  { ...
于 2015-05-28T13:05:06.787 回答