我正在使用这样的地图:
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-&gt; second-&gt; GetUserID()上崩溃。我做错了什么?
答案 0 :(得分:0)
您没有检查i != m_mUsers.end()
。这是不正确的,除非
保证您的案件中存在sd
。
i = m_mUsers.find( sd );
//You should do the check before erasing
if (i != m_mUsers.end()) {
m_mUsers.erase( i );
}
这应该使代码正常工作。顺便说一句,我建议你使用
std::shared_ptr
或std::unique_ptr
代表地图的mapped_type
。
如果您没有可用的c ++ 11,可以尝试technical report或boost libraries,
其中包括智能指针。
如果您只想提供参考而不关心CUser
中std::map
的管理,
你也可以这样做,这意味着你不管理CUser
的内存(仅限c ++ 11):
//No room for the question: Who is managing CUser memory in this map?
std::map<int, std::reference_wrapper<CUser>> m_mUsers;
如果您不修改用户,您甚至可以这样做:
//Note I added const to CUser
std::map<int, std::reference_wrapper<CUser const>> m_mUsers;