最近在写代码的过程当中,发现了一处删除map元素致使的异常。主要是由于不安全的使用for循环遍历map并删除元素致使的。 我一开始的时候,代码以下:html
for(it_pos = map.begin();it_pos!=map.end();it_pos++) { printf("111\n"); if( 0 == it_pos->second ) { map.erase(it_pos); } printf("222\n"); }
在运行起来以后,发现整个线程只输出了一次 "111\n222\n",线程就卡在了,不在日后运行了,后来查阅资料,发现了是 it_pos 自增的问题。参考页面是:std::map的安全遍历并删除元素的方法。安全
这上面代码的问题是,当咱们删除了 it_pos 以后,it_pos 这个迭代器已经失效了,对其进行 it_pos++ 操做,就是未知的操做,会引发异常。因此咱们应该在删除 it_pos 以前就对其进行 ++。改为下面的代码就能够解决问题了。线程
for(it_pos = map.begin();it_pos!=map.end();) { if( 0 == it_pos->second ) { map.erase(it_pos++); } else { it_pos++; } }