QT容器类QList调用erase崩溃

如果有遇到程序崩溃在容器类的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;
}
相关推荐
jinyishu_17 小时前
C++ 多态完全指南:从基础语法到底层原理
开发语言·c++·程序人生·面试
larance18 小时前
机器学习特征预处理之标准化/归一化
开发语言·python·机器学习
农村小镇哥18 小时前
C#中的字符串格式化
服务器·开发语言·c#
Android洋芋19 小时前
AI辅助C盘清理
c语言·开发语言·人工智能·ai辅助c盘清理
灯澜忆梦20 小时前
Go 语言 _JSON---序列化与反序列化
开发语言·golang·json
麻瓜老宋21 小时前
AI开发C语言应用按步走,表达式计算器calc的第四步,交互式 REPL 模式
c语言·开发语言·atomcode
猫猫不是喵喵.21 小时前
双亲委派机制与类加载过程
java·开发语言
布朗克16821 小时前
Go入门到精通-22-同步原语
开发语言·后端·golang·同步原语
帅次21 小时前
Kotlin Flow 与 StateFlow:UI 单向数据流基础
开发语言·ui·kotlin·stateflow·onlifecycle