1

奇妙なエラーがあります: ostringstream の内容を unsigned chars のベクトルにコピーしたい:

vector< uint8_t > buffer;
ostringstream os;
os << num1 << char1 << num2 << char2;

// 1. this will crash
buffer.insert( buffer.end(), os.str().begin(), os.str().end() );

// 2. this also crash
copy( os.str().begin(), os.str().end(), back_inserter( buffer );

string str = os.str();

// 4. this work 
buffer.insert( buffer.end(), str().begin(), str().end() );

// 5. this also works
copy( str().begin(), tr().end(), back_inserter( buffer );

Visual Studio 2010 で 1 と 2 がクラッシュする理由がわかりません。

誰かが提案していますか?

編集

解決策は次のとおりです。

vector< uint8_t > buffer;
ostringstream os;
os << num1 << char1 << num2 << char2;

const string& str = os.str();

// 4. this work 
buffer.insert( buffer.end(), str().begin(), str().end() );
4

2 に答える 2

2
os.str().begin()

の内容を含む新しい一時文字列を返しますos。イテレータをその先頭に持っていきます。

os.str().end()

の内容を含む別の一時文字列を返しますos。イテレータを最後まで取得します。

一時的な文字列は現在スコープ外であるため、2 つの反復子は有効ではありません。さらに、イテレータも同じシーケンス (ここでは文字列)に属していません。

あなたがしていることは、ほとんどダングリングイテレータを考慮していなくても)と同等です

string str1 = os.str();
string str2 = os.str();

buffer.insert( buffer.end(), str1.begin(), str2.end() );
于 2013-05-17T20:19:48.283 に答える
2

ostringstream::str()基礎となるバッファのコピーを返します。

ケース1と2では、str()2回(1回begin()と1回end())呼び出すため、結果の各イテレータはバッファの異なるコピーに関連します。さらに、これらの文字列は一時的なものであるため、すぐに範囲外になり、イテレータが「ぶら下がった」ままになります。

于 2013-05-17T20:19:55.843 に答える