请问map里的元素如何安全地erase

meuveran 2009-10-30 06:45:02
我设计的方法老是会导致程序崩溃。全部是erase那里有问题。

我的程序结构
stuct MSG_PLAYER
{
DWORD dwPlayer;
char ID[20];
};


typedef map<DWORD,MSG_PLAYER>::value_type valtype;//声明一个别名

map<DWORD,MSG_PLAYER> playlist;//定义一个MAP对象
MSG_PLAYER p1;


playlist.insert(valtype(p1.dwPlayer,p1));//KEY为p1里的DWORD,VALUE为p1


清除时(以下两种方法都会令程序崩溃)
playlist.erase(p1.dwPlayer);

if(!playerlist.empty())
{
map<DWORD,MSG_PLAYER>::iterator iter;
iter=playlist.find(p1的DWORD);
playlist.erase(iter);
}


错误信息有时是set erase iterator outside range
有时是
Detected memory leaks!
Dumping objects ->
。。一堆内存泄漏。。
Object dump complete.
...全文
356 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
meuveran 2009-10-30
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 smile_tiger 的回复:]
可能是其他问题引起的,比如多线程 ,map是线程不安全的

或者误用memcpy破坏了playlist对象之类的


iter=playlist.find(p1的DWORD); 的时候,你检查了它是否等于playlist.end()了么?

[/Quote]

啊。。确实是多线程的。。
end()也是没有检查。。。。因为我要服务器维护一个当前登陆了的玩家列表,所以想用MAP,他的键-值方式比较方便,以前都是用链表,这样每次有操作都要遍历
Smile_Tiger 2009-10-30
  • 打赏
  • 举报
回复
可能是其他问题引起的,比如多线程 ,map是线程不安全的

或者误用memcpy破坏了playlist对象之类的


iter=playlist.find(p1的DWORD); 的时候,你检查了它是否等于playlist.end()了么?

33,028

社区成员

发帖
与我相关
我的任务
社区描述
数据结构与算法相关内容讨论专区
社区管理员
  • 数据结构与算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧