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;
}
相关推荐
名字还没想好☜9 小时前
Python f-string 进阶:数字格式化、对齐填充、调试 = 号与嵌套表达式
开发语言·数据库·python·字符串格式化·f-string
一壶浊酒..12 小时前
Scrape Webpack练习
开发语言·javascript·webpack
命运之光13 小时前
【C语言完整代码】就诊信息管理系统
java·c语言·开发语言
命运之光13 小时前
【C语言完整代码】图书管理系统:图书馆场景下的增删改查实战
c语言·开发语言
猿长大人14 小时前
C# | Serilog 新手入门
开发语言·c#·.net·log
在世修行15 小时前
从零打造 C# 工业视觉检测系统(七):串口通信 SerialPort 封装与开发
开发语言·c#·modbus rtu·rs232/rs485
Hammer_Hans15 小时前
DFT笔记98
java·开发语言·数据库
≮傷£≯√16 小时前
Opencv VideoCapture
qt·opencv
qq_4480111617 小时前
C语言中的野指针和空指针
c语言·开发语言·单片机
估值探索者17 小时前
【Python实时盯盘与预警 #08】成交额突然放大2倍?Python窗口比较抓异动
java·开发语言·python