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
阅读(377) | 评论(0) | 转发(0) |