如果有遇到程序崩溃在容器类的erase函数,那你可能遇到和我一样的问题。当QList前面还有数据,且被删除到倒数第二个或最后一个时,容器end的位置(地址)发生了变化,如果不重新获取end的位置,那就会出现越界的问题。
cpp
//崩溃样例
QList<int> ls;
ls << 1 << 2 << 3 << 4;
auto begin = ls.begin();
auto end = ls.end();
while(begin != end)
{
qDebug() << begin.i << ls.end().i;
if(*begin == 3 || *begin == 4)
begin = ls.erase(begin);
else
++begin;
}
正确的做法就是,在进行批量删除时,每次遍历下一个的时候都重新获取容器的end位置,避免遇到容器end的位置(地址)发生了变化造成的越界问题。
cpp
//正确样例
QList<int> ls;
ls << 1 << 2 << 3 << 4;
auto begin = ls.begin();
while(begin != ls.end())
{
qDebug() << begin.i << ls.end().i;
if(*begin == 3 || *begin == 4)
begin = ls.erase(begin);
else
++begin;
}