2012-12-29 45 views
0
string s; 
cin>>s; 
string::iterator it; 
it=s.begin(); 
s.push_back('0'); 
s.erase(it); 
cout<<s<<endl; 

每次我輸入一個4字母串,如「牛奶」,它被證明是核心轉儲。其他字符多於或少於4個字母可以很好地工作。怎麼了 ?爲什麼我會傾倒核心? (CPP代碼)

+1

所以它編譯或不?你發佈的是一個編譯器錯誤。 – 2012-12-29 12:17:21

+0

@ H2CO3我認爲編譯器錯誤只是使用Codepad作爲公共剪貼板而不發佈完整代碼的後果。刪除 - 我的錯。 –

回答

1

修改之後的字符串指定迭代器失效從字符串中生成的迭代器。

從技術上講他們只是無效僅如果字符串重新大小。
但除非你採取明確的預防措施,以防止串大小調整,你必須假定,當你添加的內容,增加大小的字符串的任何迭代器失效。

參見:www.sgi.com/tech/stl/basic_string.html

還要注意的是,根據C++標準,basic_string的具有非同尋常的迭代器失效語義。通過交換,保留,插入和擦除(以及相當於插入和/或擦除的函數,如清除,調整大小,追加和替換),迭代器可能會失效。然而,第一次調用任何非const成員函數,包括非const版本的begin()或operator [],都可能使迭代器失效。 (這些迭代器失效規則的目的是給實現者更多的實現技術自由。)在這個實現中,begin(),end(),rbegin(),rend(),operator [],c_str()和data )不會使迭代器失效。

4

嘗試添加0到底

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

如果你告訴我們爲什麼這應該工作,你得到我的upvote。 –

+0

@honk修改數據,同時遍歷它通常不是安全的,但我不能肯定地說.. – none

+0

我同意。這裏的解釋可能會有很長的路要走。 – chris

相關問題