0

私はJavaScriptでデータを読み込んでおり、そのようなJsonstringをWebサーバーに渡してい{"data_size":500, "array":[0,0,0,0,..,0,0]}ます。配列内の数値は、0 から 4294967295 までの任意の数値です。

Mongoose Web サーバーでは、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->contentjson 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

問題を解決しました!

境界の外にゼロを書き込むと、エラーが発生しました。

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 に答える
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 に答える