string s;
cin>>s;
string::iterator it;
it=s.begin();
s.push_back('0');
s.erase(it);
cout<<s<<endl;
每次我輸入一個4字母串,如「牛奶」,它被證明是核心轉儲。其他字符多於或少於4個字母可以很好地工作。怎麼了 ?爲什麼我會傾倒核心? (CPP代碼)
string s;
cin>>s;
string::iterator it;
it=s.begin();
s.push_back('0');
s.erase(it);
cout<<s<<endl;
每次我輸入一個4字母串,如「牛奶」,它被證明是核心轉儲。其他字符多於或少於4個字母可以很好地工作。怎麼了 ?爲什麼我會傾倒核心? (CPP代碼)
修改之後的字符串指定迭代器失效從字符串中生成的迭代器。
從技術上講他們只是無效僅如果字符串重新大小。
但除非你採取明確的預防措施,以防止串大小調整,你必須假定,當你添加的內容,增加大小的字符串的任何迭代器失效。
參見:www.sgi.com/tech/stl/basic_string.html
還要注意的是,根據C++標準,basic_string的具有非同尋常的迭代器失效語義。通過交換,保留,插入和擦除(以及相當於插入和/或擦除的函數,如清除,調整大小,追加和替換),迭代器可能會失效。然而,第一次調用任何非const成員函數,包括非const版本的begin()或operator [],都可能使迭代器失效。 (這些迭代器失效規則的目的是給實現者更多的實現技術自由。)在這個實現中,begin(),end(),rbegin(),rend(),operator [],c_str()和data )不會使迭代器失效。
所以它編譯或不?你發佈的是一個編譯器錯誤。 – 2012-12-29 12:17:21
@ H2CO3我認爲編譯器錯誤只是使用Codepad作爲公共剪貼板而不發佈完整代碼的後果。刪除 - 我的錯。 –