QT报错:“pure virtual method called; terminate called without an active exception“

QT报错:"pure virtual method called; terminate called without an active exception"

1. 错误出现

最近使用QT写一个驱动器调试助手的时候,使用QT来编写界面,程序编译运行没有问题,但是在退出后,QT的Debug窗口报错:

pure virtual method called
terminate called without an active exception

2. 错误分析

在网络上查找类似问题,但大部分都说的比较模糊,大致集中在存在纯虚函数调用,析构函数中内存空间释放出现问题。根据这个思想进行分析。
由于我的代码中并没有写任何继承和虚函数,所以这问题只能定位在析构函数中我的内存空间释放出现了问题。但是delete这个关键字的语法使用的很频繁,不可能在这个上面出问题,那么问题很清楚了,肯定是我的内存释放顺序出现了问题。即:
这些指针对应的对象存在继承或者其他包含关系,在继承中基类肯定会有纯虚函数和虚析构函数,那么我在释放空间的时候顺序出现问题,则导致一些函数调用报错

3. 错误解决

我在析构函数中需要释放一些空间,然后这些空间开辟的代码如下:

void DriverMainWindow::initChartView()
{
    // 内存分配
    mpChart = new QChart();
    mpXaxis = new QValueAxis();
    mpYaxis = new QValueAxis();
    mpCurLine = new QLineSeries();
    mpVelLine = new QLineSeries();
    mpPosLine = new QLineSeries();
    mpCmdLine = new QLineSeries();

    // 1. 添加曲线到chart上  必须先添加曲线
    mpChart->addSeries(mpCurLine);
    mpChart->addSeries(mpVelLine);
    mpChart->addSeries(mpPosLine);
    mpChart->addSeries(mpCmdLine);

    // 2. 命名
    mpXaxis->setTitleText(tr("时间(ms)"));
    mpYaxis->setTitleText(tr("未定义"));

    // 3. 坐标轴显示范围
    mpXaxis->setMin(-10);
    mpXaxis->setMax(10);
    mpYaxis->setMin(-30);
    mpYaxis->setMax(30);

    // 4. 坐标轴格点、颜色、网格可视化
    mpYaxis->setTickCount(9);
    mpYaxis->setGridLineColor(QColor(130, 57, 53));
    mpYaxis->setGridLineVisible(false);

    // 5. 坐标轴位置
    mpChart->addAxis(mpXaxis, Qt::AlignBottom);
    mpChart->addAxis(mpYaxis, Qt::AlignLeft);

    // 6. 线条
    // 颜色,粗细,线型,线条最后收头样式,线条连接样式
    QPen pen1(QColor(216, 26, 33), 3, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin); // 红色
    QPen pen2(QColor(229, 131, 8), 3, Qt::SolidLine, Qt::SquareCap, Qt::BevelJoin); // 橙色
    mpCmdLine->setPen(pen1);
    mpCmdLine->setName(tr("指令值")); // 线条名称
    mpCurLine->setPen(pen2);
    mpCurLine->setName(tr("电流值")); // 线条名称
    mpVelLine->setPen(pen2);
    mpVelLine->setName(tr("速度值")); // 线条名称
    mpPosLine->setPen(pen2);
    mpPosLine->setName(tr("位置值")); // 线条名称

    // 7. 曲线关联坐标轴
    mpCmdLine->attachAxis(mpXaxis);
    mpCmdLine->attachAxis(mpYaxis);
    mpCurLine->attachAxis(mpXaxis);
    mpCurLine->attachAxis(mpYaxis);
    mpVelLine->attachAxis(mpXaxis);
    mpVelLine->attachAxis(mpYaxis);
    mpPosLine->attachAxis(mpXaxis);
    mpPosLine->attachAxis(mpYaxis);

    // 8. chart显示到窗口
    ui->curveChartView->setChart(mpChart);

    // 9. 设置曲线隐藏
    mpCmdLine->hide();
    mpCurLine->hide();
    mpVelLine->hide();
    mpPosLine->hide();
}

那么在析构函数中进行空间释放的时候必须考虑到顺序,线条挂载于坐标轴上,坐标轴挂载于画图view上,画图view挂载于ui上,那么空间释放的时候一定要从小到大,从内到外。则析构函数的顺序如下:

DriverMainWindow::~DriverMainWindow()
{
    delete mpCurLine;
    delete mpVelLine;
    delete mpPosLine;
    delete mpCmdLine;
    delete mpXaxis;
    delete mpYaxis;
    delete mpChart;

    mpChart = nullptr;
    mpXaxis = nullptr;
    mpYaxis = nullptr;
    mpCurLine = nullptr;
    mpVelLine = nullptr;
    mpPosLine = nullptr;
    mpCmdLine = nullptr;

    delete ui;
}

4. 错误总结

这是我在遇到这个报错的时候的解决办法,当然可能也有其他形式导致的出错,暂时没有遇到过,就具体问题具体分析了。

  • 12
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值