关于map使用失误

今天又犯了个错误:
原先 typedef std::map<uint32_t, XXX*> XXXMap;
XXXMap xxx;
然后在退出时删除:

for (XXXMap::iterator it = xxx.begin(); it != xxx.end(); ++it) {
   delete it->second;
}
这个没问题。一切OK。


后来修改: typedef std::map<uint32_t, XXX> XXXMap;
XXXMap xxx;
然后在退出时删除:

for (XXXMap::iterator it = xxx.begin(); it != xxx.end(); ++it) {          
   xxx.erase(it);
}

此时后造成死循环。

 

STL的map表里有一个erase方法用来从一个map中删除掉指令的节点

 

XXXMap::iterator it = xxx.find(key);
xxx.erase(it);
像上面这样只是删除单个节点,map的形为不会出现任务问题.

但是当在一个循环里用的时候,往往会被误用,那是因为没有正确理解iterator的概念.

上面这样的一个例子一种错误的写法,会导致程序行为不可知.究其原因是map 是关联容器,对于关联容器来说,如果某一个元素已经被删除,那么其对应的迭代器就失效了,不应该再被使用;否则会导致程序无定义的行为。

 

可以用以下方法解决这问题:
正确的写法
1.使用删除之前的迭代器定位下一个元素。STL建议的使用方式
for(XXXMap::iterator it = xxx.begin(); it != xxx.end();)
{
   xxx.erase(it++);
}

2. 其实退出时只要xxx.clear()就可以,甚至连这个都可以不要。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值