为什么我会把核心倾倒? (C ++代码)

时间:2012-12-29 12:12:19

标签: c++

string s;
cin>>s;
string::iterator it;
it=s.begin();
s.push_back('0');
s.erase(it);
cout<<s<<endl;

每次我输入一个4个字母的字符串,如“milk”,结果是核心转储。其他含有多于或少于4个字母的单词可以很好地工作。怎么了?

2 个答案:

答案 0 :(得分:4)

在将0添加到结尾

后尝试分配迭代器
string s;
cin>>s;
s.push_back('0');
string::iterator it;
it=s.begin();
s.erase(it);
cout<<s<<endl;

答案 1 :(得分:1)

修改字符串会使从字符串生成的所有迭代器无效。

从技术上讲,只有当字符串重新调整大小时,它们才会失效 但除非你采取明确的预防措施来防止字符串重新调整大小,否则你必须假设当你向字符串中添加增加大小的内容时,任何迭代器都会失效。

请参阅:www.sgi.com/tech/stl/basic_string.html

  

另请注意,根据C ++标准,basic_string具有非常不寻常的迭代器失效语义。迭代器可能通过交换,保留,插入和擦除(以及等效于插入和/或擦除的函数,例如清除,调整大小,追加和替换)而无效。

     

此外,第一次调用任何非const成员函数(包括非const版本的begin()或operator [])可能会使迭代器无效。 (这些迭代器失效规则的目的是为实现者提供更大的实现技术自由。)在这个实现中,begin(),end(),rbegin(),rend(),operator [],c_str()和data( )不要使迭代器无效。