地图上满是垃圾记录
map filled with junk records
我是这样使用地图的:
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_ptr
或std::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;
相关文章:
- 为什么不;名字在地图上是按顺序排列的吗
- 基于多个条件处理地图中的所有元素
- 将两个数组中的差异记录在第三个数组中
- 在C++中将矢量转换为嵌套地图
- 替换基于地图的所有引用
- 如何区分地图中的 0 和 false?
- 地图计数确实很重要,或者只是检查是否存在
- 如何从地图中删除矢量对象
- 是否有任何C++功能可以对地图进行排序?
- 如何使用 std::variant 打印地图键/值?
- 从矢量或地图中删除共享指针
- 在 c++ 中,有一种方法可以创建一个包含地图作为值的树状地图?
- 无限嵌套具有变体的地图
- C++一会儿循环读到地图上 2 行?
- 如何在cpp中使用地图显示给定日期范围内(在下面的问题中)的费率?
- 禁止在控制台上记录谷神星
- 创建 Spdlog 异步文件记录器时遇到困难
- 如何检查变量是否是C++中的地图?
- STL向量和地图在删除一组记录时应该更喜欢
- 地图上满是垃圾记录