0

次のように宣言されたrapidjson::Documentにデータを追加する次のコードがあります。

rapidjson::Document rest;
rest.SetObject();

ループで。

Value v(value.c_str());
stringstream ss;//create a stringstream
ss << "a" << colnum;
const char* colnumstr = ss.str().c_str();     
cout << "json: colnumstr = \"" << colnumstr << "\", value = \"" << value << "\"" << endl;
rest.AddMember(colnumstr,v,rest.GetAllocator());

ループが終了したら、次のようにjsonを文字列としてマップに追加します。

StringBuffer buffer;
Writer<StringBuffer> writer(buffer);
rest.Accept(writer);

string reststring = buffer.GetString();
cout << "Pushing " << reststring << " to map" << endl;
parseddata["rest"].push_back(reststring);

ここに奇妙なビットがあります:

json: colnumstr = "a1", value = "13745438"
json: colnumstr = "a2", value = "#N/A"
json: colnumstr = "a9", value = "Top 19"
Pushing {"a1":"9999\u0000438","99":"#N/A","31":"Top 19"} to map

特定の値が変更されているようです。しかし、私にはその方法や理由がわかりません。

4

1 に答える 1

2

私が最初に目にするのは、この間違いです(おそらくあなたの問題とは関係ありません):

const char* colnumstr = ss.str().c_str();

これは間違っています。なぜですか :

ss.str(): 文字列インスタンスのコピーを返します。

.c_str(): この文字列の内部データを取得します

ただし、文字列インスタンスは結果を出力する前に次の行を破棄するため、colnumstr ポインターはメモリ内で無効なものを指しています。ほとんどの場合、データがまだ有効であることを願っています...しかし、場合によっては、データが他の何かによって上書きされる可能性があります。

適切な解決策は、

string colnumstrObj = ss.str();
const char* colnumstr = colnumstrObj .c_str();

colnumstrObjすぐではなく、関数の最後に破棄されます...

于 2012-12-12T14:30:33.390 に答える