最近在做项目时遇到的问题,总结一下。
我定义了一个std::map m_students,不断往里添加记录,定时检测,例如30秒检测一次,符合某些条件的记录将被清除掉,之前的定时清除的代码是这样写的:
void Example::eraseStudents()
{
std::map<long,int>::iterator it = m_students.begin();
while(it != m_students.end())
{
if(it->second > 60) //判断条件为成绩大于60分时
{
m_students.erase(it->first);
}
it++;
}
}
看起来逻辑很清楚,代码也是正确的。但是运行起来程序总是中断,后来在网上查了一下erase方法,才明白这样写究竟错在了哪里。
原因是当调用erase()后it迭代器就失效了,变成了野指针。所以后面it++就会出问题。找到问题的原因之后,把程序修改了一下:
void Example::eraseStudents()
{
std::map<long,int>::iterator it = m_students.begin();
while(it != m_students.end())
{
if(it->second > 60) //判断条件为成绩大于60分时
{
it = m_students.erase(it);
}
else
{
it++;
}
}
}
这样就没问题了,希望能帮助到你,谢谢!