-1

Boost Property Tree を少しいじっていたところ、この例に出会いました。最終結果をベクトルに変換する必要があったので、あとにもう 1 行追加しました。

write_json(ss, root);

このような:

std::vector<char> testVec(std::begin(ss.str()), std::end(ss.str()));

代わりにこれも試しました:

std::string someString = ss.str()
char* someArray = (char*)someString.c_str();
std::vector<char> someVec(someArray, someArray+sizeof(someArray));

どちらの場合も、次のエラーが発生します。

terminate called after throwing an instance of 'std::bad_alloc'
what():  std::bad_alloc

私が間違っていることのヒントはありますか?プロパティ ツリーの問題ではありませんね。文字列からベクトルへの変換の問題です。ベクトルは 1 次元のみであると想定されているため、これは理にかなっていると思いますが、その文字列をベクトルに変換して元に戻す方法がわかりません。

4

2 に答える 2

13

これは失敗します:

std::vector<char> testVec(std::begin(ss.str()), std::end(ss.str())); 

std::begin()とは同じインスタンスstd::end()に関連付けられていないためです。std::stringは毎回ss.str()新しいインスタンスを返しますが、一部の内部メンバーには戻りません。std::stringstd::string&

これは正しくありません:

std::vector<char> someVec(someArray, someArray+sizeof(someArray)); 

sizeof(someArray)ですのでsizeof(char*)。未満のsizeof(char*)要素がある場合はsomeArray、メモリを読み取るべきでないメモリを読み取ろうとします。

考えられる解決策:

std::string someString = ss.str();
std::vector<char> someVec(someString.begin(), someString.end());
于 2012-09-04T15:59:42.740 に答える
0

sizeof()C文字列は長さを知らないため(ヌル終了)、配列の長さを示していません。配列の先頭にあるポインターのメモリ位置のサイズを提供しているだけなので、注意しないと operator[] を使用して文字列の末尾を超えて参照できます。

もう 1 つの解決策は、sizeof をオーバーロードして、null ターミネータに到達するまで文字列を反復処理することですが、これは、余分な作業を行わずに組み込みのもので実行できるように思えます。

于 2012-09-04T16:03:37.297 に答える