o字符串流到矢量<uint8_t>

ostringstream to vector<uint8_t>

本文关键字:uint8 gt 字符串 lt      更新时间:2023-10-16

我有一个奇怪的错误:我想将ostringstream的内容复制到一个未签名字符的向量中:

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在visualstudio2010上崩溃。

有人有什么建议吗?

编辑

解决方案是:

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() );
os.str().begin()

返回一个新的临时字符串,其中包含os的内容。你把迭代器带到它的开头。

os.str().end()

返回内容为os的另一个临时字符串。你把迭代器带到它的末尾。

这两个迭代器无效,因为临时字符串现在超出了作用域。此外,迭代器也不属于同一序列(此处为字符串(。

您正在做的是几乎(甚至不考虑悬挂迭代器(等效于

string str1 = os.str();
string str2 = os.str();
buffer.insert( buffer.end(), str1.begin(), str2.end() );

ostringstream::str()返回底层缓冲区的副本

在你的情况下1&2您调用str()两次(一次用于begin(),一次用于end()(,因此每个生成的迭代器都与缓冲区的不同副本相关。此外,这些字符串是临时字符串,因此它们立即超出范围,使迭代器"悬空"。