帮忙看看这段程序哪有错误

lenying 2008-12-24 03:52:36
//lst是list容器 iter为迭代器
iter=lst.begin();
for(;iter!=lst.end();iter++)
{
CClientConn *pClientConn=(CClientConn*)*iter; //CClientConn是自定义的类
if(pClientConn->isExit())
{
lst.erase(iter);
delete pClientConn;
pClientConn=NULL;
}
}
这样运行时出错,原因在
for(;iter!=lst.end();iter++)
{
CClientConn *pClientConn=(CClientConn*)*iter;
这两行上,经过循环后,iter已经不满足iter!=lst.end(),但是还能进入到循环,pClientConn=(CClientConn*)*iter取不到值,出错了,可是为什么还能进入循环呢,先下面这样就不会出现错误:
iter=lst.begin();
for(;iter!=lst.end();) //注意这里把iter++去掉,放到下面
{
CClientConn *pClientConn=(CClientConn*)*iter; //CClientConn是自定义的类
if(pClientConn->isExit())
{
lst.erase(iter++); //iter++放到这
delete pClientConn;
pClientConn=NULL;
}
else
iter++; //iter++放到这
}

这就正常运行,为什么啊?
谢谢各位!
...全文
86 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Aaronico 2008-12-24
  • 打赏
  • 举报
回复

iter= lst.erase(iter);
Aaronico 2008-12-24
  • 打赏
  • 举报
回复

lst.erase(iter);
lifengjiangol 2008-12-24
  • 打赏
  • 举报
回复
你把元素删除之后,销毁是不可能的,你应该用一个暂存单元保存它再销毁
太乙 2008-12-24
  • 打赏
  • 举报
回复
呵呵,因为你在erase迭代器的时候,该迭代器本身就失效了!

比如:
对于erase(it);那么这语句执行完后,it失效(it指向的元素被删除了)

所以你后面对其++就毫无意义!


如果是:erase(it++);那么,可以想象一下,it++的实现,它让it指向下一个元素,然后,给erase传递的是一个tempIt;tempIt是无效了,但是it还是有效的!!
ckt 2008-12-24
  • 打赏
  • 举报
回复
http://topic.csdn.net/u/20080722/05/884ADB73-1CC0-4226-8E18-9280014939EB.html

65,211

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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