• 2733阅读
  • 2回复

[提问]tableView显示实时数据,会不会内存泄漏? [复制链接]

上一主题 下一主题
离线ssff5678
 

只看楼主 倒序阅读 楼主  发表于: 2019-11-04
利用Qt modbus做了一个每秒读取串口数据的tableView,在为QStandardItemModel赋值时,每次都要new  QStandardItem值,然后再setItem,没有delete操作,长时间运行是否发生内存泄漏呢?请大神赐教,谢谢!
构造:
  1. MainWindow::MainWindow(QWidget *parent)
  2.     : QMainWindow(parent)
  3.     , ui(new Ui::MainWindow)
  4.     , lastRequest(nullptr)
  5.     , modbusDevice(nullptr)
  6. {
  7.     ui->setupUi(this);
  8.     realTime=new QTimer();
  9.     realTime->stop();
  10.     connect(realTime,&QTimer::timeout,this,&MainWindow::readQuest);
  11.     tableModel=new QStandardItemModel(10,2,this);
  12. tableModel->setHeaderData(0,Qt::Horizontal,tr("地址"),0);
  13.     tableModel->setHeaderData(1,Qt::Horizontal,tr("实时值"),0);
  14. //    tableModel->setHorizontalHeaderItem(2,new QStandardItem(tr("第三列")));
  15.     ui->tableView->setModel(tableModel);
  16.     ui->tableView->setGridStyle(Qt::PenStyle(2));
  17.     ui->tableView->setAlternatingRowColors(1);
  18. }

实时读取:
  1. void MainWindow::realTimeReadReady()
  2. {
  3.     auto reply = qobject_cast<QModbusReply *>(sender());
  4.     if (!reply)
  5.         return;
  6.     QStandardItem *rtItem1;
  7.     QStandardItem *rtitem2;
  8.     if (reply->error() == QModbusDevice::NoError) {
  9.         const QModbusDataUnit unit = reply->result();
  10.         for (uint i = 0; i < unit.valueCount(); i++) {
  11.             const QString rTValue=tr("%1").arg(unit.startAddress()+i);
  12.             rtItem1=new QStandardItem(rTValue);//每次都要new 一个QStandardItem,长时间会发生内存泄漏吗?
  13.             tableModel->setItem(i,0,rtItem1);
  14. //            QString::number(unit.value(i));
  15.             rtitem2=new QStandardItem(QString::number(unit.value(i)));
  16.             tableModel->setItem(i,1,rtitem2);
  17.         }
  18.     } else if (reply->error() == QModbusDevice::ProtocolError) {
  19.         statusBar()->showMessage(tr("Read response error: %1 (Mobus exception: 0x%2)").
  20.                                     arg(reply->errorString()).
  21.                                     arg(reply->rawResult().exceptionCode(), -1, 16), 5000);
  22.     } else {
  23.         statusBar()->showMessage(tr("Read response error: %1 (code: 0x%2)").
  24.                                     arg(reply->errorString()).
  25.                                     arg(reply->error(), -1, 16), 5000);
  26.     }
  27.     reply->deleteLater();
  28. //    delete rtItem1; //这样处理会删除最后一个数据
  29. //    delete rtitem2;
  30. }
或者有没有更好的办法来实现实时刷新功能,因为软件要长期运行的,非常感谢!

离线liulin188

只看该作者 1楼 发表于: 2019-11-04
曾经我的也纠结过这个问题,最后大批量测试发现不会内存泄漏,不用手动delete,放心试用
qt的控件有他自己的一套内存管理机制
https://wiki.qt.io/Qt_5.12_Release
https://wiki.qt.io/New_Features_in_Qt_5.12
https://wiki.qt.io/Qt_5.12.0_Known_Issues
https://www.qt.io/blog/qt-5.13.2-released
https://www.qt.io/blog/qt-creator-4.10.2-released
https://wiki.qt.io/Qt_5.12_Tools_and_Versions
离线zypher

只看该作者 2楼 发表于: 2019-11-08
Qt 内存管理通过父子对象之间的关联来管理的,父对象删除了,对应的子对象都会被删除,而子对象删除时相应的父对象会从其自身的子对象链将其移除
快速回复
限100 字节
 
上一个 下一个