转[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);