地图充满了垃圾记录

时间:2013-03-21 11:32:00

标签: c++ stl

我正在使用这样的地图:

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()上崩溃。我做错了什么?

1 个答案:

答案 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_ptrstd::unique_ptr代表地图的mapped_type。 如果您没有可用的c ++ 11,可以尝试technical reportboost libraries, 其中包括智能指针。 如果您只想提供参考而不关心CUserstd::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;