繁体   English   中英

ostringstream到矢量<uint8_t>

[英]ostringstream to vector<uint8_t>

我有一个奇怪的错误:我想将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在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() );
os.str().begin()

返回包含os内容的新临时字符串。 您将迭代器带到它的开始。

os.str().end()

返回另一个包含os内容的临时字符串 您将迭代器移到它的末尾。

这两个迭代器无效,因为临时字符串现在不在范围内。 此外,迭代器也不属于同一序列( 此处为string )。

您正在执行的操作几乎甚至不考虑悬挂的迭代器 )等同于

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

buffer.insert( buffer.end(), str1.begin(), str2.end() );

ostringstream::str()返回基础缓冲区的副本

在您的情况1和2中,您两次调用str() (一次是begin() ,一次是end() ),因此每个结果迭代器都与缓冲区的不同副本相关。 此外,这些字符串是临时字符串,因此它们会立即超出范围,从而使迭代器“悬而未决”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM