轉[http://blog.csdn.net/yanonsoftware/archive/2005/11/26/537314.aspx]
有一個界面系統,一個window類,用來封裝自身的操作、繪圖功能,并管理它的所有子窗口:
class Window
{
Window* m_pParent;
list<Window*> m_children;
public:
void RemoveChild(Window *pChild)
{
m_children.remove(pChild);
}
virtual void Update()
{
for(list<Window*>::iter=m_children.begin();
iter=m_children.end();++iter)
{
(*iter)->Update();
}//endof for
}
};
這個Window::Update()函數負責處理窗口邏輯,結果在某個窗口的Update寫成了這樣:
class MyDlg : public Window
{
public:
virtual void Update()
{
if(m_bClosed)
m_pParent->RemoveChild(this);
else
Window::Update();
}
};
當一個模塊的邏輯比上述例子復雜很多時,這種情況更難以掌握,為了防止模塊客戶的代碼產生類似的行為,我不得不把代碼寫成這樣:
class Window
{
Window* m_pParent;
list<Window*> m_children;
bool m_bLock;
public:
void RemoveChild(Window *pChild)
{
ASSERT(!m_bLock);
m_children.remove(pChild);
}
virtual void Update()
{
m_bLock=true;
for(list<Window*>::iter=m_children.begin();
iter=m_children.end();++iter)
{
(*iter)->Update();
}//endof for
m_bLock=false;
}
};
這個問題就出在了順序迭代器的刪除問題上iterator,順序迭代器刪除的正確寫法是:
iter = xxx.erase(iter);