我有一个奇怪的错误:我想将一个ostringstream的内容复制到一个无符号字符的vecotr中:
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 );
我无法理解为什么1和2会在visual studio 2010上崩溃。
有人有一些建议吗?
编辑
解决方案是:
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() );
答案 0 :(得分:2)
os.str().begin()
返回一个新的临时字符串,其内容为os
。你将迭代器放在它的开头。
os.str().end()
返回另一个临时字符串,内容为os
。你将迭代器放在它的末尾。
这两个迭代器无效,因为临时字符串现在已超出范围。此外,迭代器也不属于相同的序列( string here )。
你正在做的是几乎(甚至不考虑悬挂的迭代器)相当于
string str1 = os.str();
string str2 = os.str();
buffer.insert( buffer.end(), str1.begin(), str2.end() );
答案 1 :(得分:2)
ostringstream::str()
会返回基础缓冲区的副本。
在你的情况下1&amp; 2您调用str()
两次(一次用于begin()
,一次用于end()
),因此每个生成的迭代器都与缓冲区的不同副本有关。此外,这些字符串是临时的,因此它们会立即超出范围,留下迭代器&#34;悬挂&#34;。