map容器的循环删除一直是一个容易出问题的地方,在删除成功之后iterator会自动往下移。
未避免涉及到这些容易混淆的问题,在删除之前先用一个Iterator来记录其下一个元素。如下:
- // remove extra windows
- video_wnd_map_t::iterator it = m_video_wnd_map.begin();
- while (it != m_video_wnd_map.end())
- {
- video_wnd_map_t::iterator it_next = it;
- ++it_next;
- if (config_map.find(it->first) == config_map.end())
- {
- need_recalc_layout = true;
- video_wnd_list_t::iterator itl = it->second;
- CMJPEGVideoWnd* pWnd = *itl;
- pWnd->Close();
- m_video_wnd_to_del.push_back(pair<CMJPEGVideoWnd*, time_t>(pWnd, time(NULL)));
- m_video_wnd_list.erase(itl);
- m_video_wnd_map.erase(it);
- }
- it = it_next;
- }