【发布时间】:2013-03-10 21:26:02
【问题描述】:
我正在使用这样的地图:
map<int,CUser*> m_mUsers;
...
for ( i = m_mUsers.begin(); i != m_mUsers.end(); i++ )
{
if( (*i).second->GetUserID() == pUser->GetUserID() )
(*i).second->OnDeviceLogout( pUser );
}
...
添加到地图:
m_mUsers[ sd ] = pUser;
从地图中删除:
i = m_mUsers.find( sd );
m_mUsers.erase( i );
当我运行它时,大多数情况下它都按我的预期工作。但很少有垃圾记录留在地图中,所以当我尝试遍历预期为空的地图时,我遇到垃圾记录,并在 i->second->GetUserID() 上崩溃...什么我做错了吗?
【问题讨论】:
-
如果
i是end怎么办?此外,可能隐藏了一个问题 - 这个pUser可能会损坏地图中的元素,因为它只是一个指针。 -
我有一个调试技巧给你。实现一个遍历地图并通过调用一个简单的验证函数来验证每个节点的函数。当您从地图中删除一个节点时,将该节点标记为无效,以便您的验证函数抱怨。然后在您的代码周围散布该验证功能。这样您就可以更快地发现失效并更好地处理根本原因。