查看完整版本: [-- tableView显示实时数据,会不会内存泄漏? --]

QTCN开发网 -> 《Qt高级编程》专栏 -> tableView显示实时数据,会不会内存泄漏? [打印本页] 登录 -> 注册 -> 回复主题 -> 发表主题

ssff5678 2019-11-04 11:13

tableView显示实时数据,会不会内存泄漏?

利用Qt modbus做了一个每秒读取串口数据的tableView,在为QStandardItemModel赋值时,每次都要new  QStandardItem值,然后再setItem,没有delete操作,长时间运行是否发生内存泄漏呢?请大神赐教,谢谢!
构造:
  1. MainWindow::MainWindow(QWidget *parent)
        : QMainWindow(parent)
        , ui(new Ui::MainWindow)
        , lastRequest(nullptr)
        , modbusDevice(nullptr)
    {
        ui->setupUi(this);

        realTime=new QTimer();
        realTime->stop();
        connect(realTime,&QTimer::timeout,this,&MainWindow::readQuest);

        tableModel=new QStandardItemModel(10,2,this);


    tableModel->setHeaderData(0,Qt::Horizontal,tr("地址"),0);
        tableModel->setHeaderData(1,Qt::Horizontal,tr("实时值"),0);
    //    tableModel->setHorizontalHeaderItem(2,new QStandardItem(tr("第三列")));

        ui->tableView->setModel(tableModel);
        ui->tableView->setGridStyle(Qt::PenStyle(2));
        ui->tableView->setAlternatingRowColors(1);
    }

实时读取:
  1. void MainWindow::realTimeReadReady()
    {
        auto reply = qobject_cast<QModbusReply *>(sender());
        if (!reply)
            return;

        QStandardItem *rtItem1;
        QStandardItem *rtitem2;
        if (reply->error() == QModbusDevice::NoError) {

            const QModbusDataUnit unit = reply->result();
            for (uint i = 0; i < unit.valueCount(); i++) {
                const QString rTValue=tr("%1").arg(unit.startAddress()+i);
                rtItem1=new QStandardItem(rTValue);//每次都要new 一个QStandardItem,长时间会发生内存泄漏吗?
                tableModel->setItem(i,0,rtItem1);
    //            QString::number(unit.value(i));
                rtitem2=new QStandardItem(QString::number(unit.value(i)));
                tableModel->setItem(i,1,rtitem2);

            }
        } else if (reply->error() == QModbusDevice::ProtocolError) {
            statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)").
                                        arg(reply->errorString()).
                                        arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
        } else {
            statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)").
                                        arg(reply->errorString()).
                                        arg(reply->error(), -1, 16), 5000);
        }

        reply->deleteLater();
    //    delete rtItem1; //这样处理会删除最后一个数据
    //    delete rtitem2;
    }
或者有没有更好的办法来实现实时刷新功能,因为软件要长期运行的,非常感谢!


liulin188 2019-11-04 11:25
曾经我的也纠结过这个问题,最后大批量测试发现不会内存泄漏,不用手动delete,放心试用
qt的控件有他自己的一套内存管理机制

zypher 2019-11-08 08:46
Qt 内存管理通过父子对象之间的关联来管理的,父对象删除了,对应的子对象都会被删除,而子对象删除时相应的父对象会从其自身的子对象链将其移除


查看完整版本: [-- tableView显示实时数据,会不会内存泄漏? --] [-- top --]



Powered by phpwind v8.7 Code ©2003-2011 phpwind
Gzip disabled