這個事情碰得多了,雖然每次碰到都知道這是不對的,但是總是避免不了,就是下面類似的代碼
typedef std::vector<int> MsgList;
MsgList m_msgList;
for(MsgList::iterator iter=m_msgList.begin(); iter!=m_msgList.end(); ++iter)
{
m_msgList.erase(iter);
}
當然,上面只是個示例代碼,實際工程中肯定不會寫出這樣的代碼
一般 MsgList m_msgList;是在某個單件中(其實單件有時確實挺噁心的,不過披了件袈裟而已)
然後在for循環中給某個地方發了一個消息然後在回調消息的地方(消息回調可能是消息隊列,也可能是直接發到了回調函數,做了優化處理)調用了邪惡的m_msgList.erase(iter);
結局就是悲劇的,程序會崩到 ++iter 這個地方(最可惡的是調試時m_msgList可能是空的),而且開始看的時候還是二丈和尚摸不着頭,一般看到問題就容易解決了