Chinaunix首页 | 论坛 | 博客
  • 博客访问: 542073
  • 博文数量: 493
  • 博客积分: 2891
  • 博客等级: 少校
  • 技术积分: 4960
  • 用 户 组: 普通用户
  • 注册时间: 2010-03-17 17:11
文章分类

全部博文(493)

文章存档

2010年(493)

分类:

2010-05-12 19:30:27

1 现象:问题描述
在系统测试时,发现在一特定条件下,在使用stl中过程中程序异常.
2 关键过程:根本原因分析
在coreDump文件的分析下,发现异常是出现在一基类ExecuterBase中
protected:
   list m_pHandlers;
protected:
    void RunEvent(const PoCDataEvent& stEvent)
 {
  list::iterator iter =
            m_pHandlers.begin();
  while (iter != m_pHandlers.end())
  {
   DataEventExecuterBase* pObj = *iter;
   if (NULL != pObj)
            {
    pObj->Execute(stEvent);
                iter++;
   }
        .......
执行上面的pObj->Execute(stEvent)的时候发生core,此时pObject已经是个野指针.跟踪此产品的日志,发现在此循环中调用了此类的下面函数
void DelDataEventHandler(DataEventExecuterBase* pHandler)
 {
  if(NULL != pHandler)
  {
            list::iterator iter ;
   for(iter = m_pHandlers.begin();iter != m_pHandlers.end();iter++)
   {
    if(pHanlder != *iter)
    {
     m_pHandlers.erase(iter);
     Break;
}
}
  }
 }
执行m_pHandlers.erase(iter);删除对应的迭代器,从而此是iter指向的地方是个野指针.从而发生野指针的访问,coreDump
3 结论:解决方案及效果
解决的方法是保证执行pObj->Execute(stEvent) 不删除iterator.如下修改函数
DelDataEventHandler(DataEventExecuterBase* pHandler)中的m_pHandlers.erase(iter);修改为*iter = NULL;这样处理时,没有删除list中迭代器.
按上修改后, 经过测试,系统正常处理
4 经验总结:预防措施和规范建议
在应用STL时时,一定要对STL具体操作和含义明确了解,要对复杂的代码进行分离测试。对于遍历与删除时应清晰明了.
5 备注
考核点
STL, 迭代器,List
阅读(337) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~