2013-05-17 62 views
0

我有一个奇怪的错误:我想一个ostringstream的内容复制到无符号字符的vecotr: ostringstream到矢量<uint8_t>

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的碰撞在视觉演播室2010.

有人有一些建议吗?

EDIT

的解决方案是:

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

如果你想'unsigned char',为什么代码使用'uint8_t'?他们不一样。 –

+0

它们是相同的,并在

+0

下定义,不,它们不一样。 'uint8_t'在没有8位无符号类型的平台上不存在。所有平台上都存在'unsigned char'。 –

回答

2
os.str().begin() 

返回一个新的临时os内容。你需要一个迭代器来开始它。

os.str().end() 

回报另一个临时串os内容。你需要一个迭代器来结束它。

这两个迭代器是无效的,因为现在临时字符串超出了范围。此外,迭代器也不属于相同的序列(字符串,在这里)。

你在做什么是几乎甚至没有考虑悬挂迭代),相当于

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

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

所以这是正确的:const string&str = os.str(); buffer.insert(buffer.end(),str()。begin(),str()。end()); –

+2

是的,这是有效的。 'os.str()'返回的临时的生命周期将被扩展到'str'的​​生命周期。你现在正从同一个序列中共同构建迭代器,所以应该没问题。 – stardust

2

ostringstream::str()返回复制底层缓冲区

在您的箱子1 & 2调用str()两次(对于end()一次begin()和一次)因此每个所得迭代涉及缓冲器的不同的副本。此外,这些字符串是临时的,因此它们立即超出范围,使迭代器“悬空”。

相关问题