地图上满是垃圾记录

map filled with junk records

本文关键字:记录 地图      更新时间:2023-10-16

我是这样使用地图的:

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;

delete from map:

i = m_mUsers.find( sd );
m_mUsers.erase( i );

当我运行这个时,大多数情况下它都像我期望的那样工作。但很少,垃圾记录留在地图,所以当我尝试迭代什么是预期的空地图,我遇到垃圾记录,并崩溃在i->second->GetUserID()…我做错了什么?

您没有检查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,你可以尝试技术报告或增强库,其中包括智能指针。如果你只是想要一个参考,而不关心在std::map中管理CUser,您也可以这样做,这意味着您不管理CUser s的内存(仅在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;