Qt QLabel跨线程更新引发内存泄漏问题求助
Qt QLabel跨线程更新引发内存泄漏问题
问题现象
- 启动QThread并通过其发出的信号更新GUI中QLabel文本时,Windows任务管理器可观察到RAM快速增长
- 同一线程、同一信号下更新其他多个控件均无内存泄漏,应用稳定;但QLabel持续使用数小时后,应用内存可达2GB,无法正常运行
- 若在主窗口的while循环中直接更新QLabel文本,则无内存泄漏问题
环境信息
- 平台:Windows
- Qt版本:6.4.2 MinGW 64Bit Debug编译
- 主窗口UI包含启动线程的按钮和目标QLabel,全局变量
g_MainFormUnit作为窗体引用,该用法在代码其他位置无异常
相关代码
mainwindow.cpp
#include <QThread> #include "mainwindow.h" #include "ui_mainwindow.h" #include "spydriver_thread.h" #include "shared.h" Ui::MainWindow * g_MainFormUnit; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); g_MainFormUnit = ui; } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_StartThreadButton_clicked() { // Capture Thread to fill packets SpyDriver_ShowViewThread * workerThread = new SpyDriver_ShowViewThread (); workerThread->start(); QObject::connect(workerThread, &SpyDriver_ShowViewThread::InsertPacket, workerThread, &SpyDriver_ShowViewThread::on_InsertPacket); }
spydriver_thread.cpp
#include <QtCore> // Includes #include <stdio.h> #include <string.h> // Qt Includes #include <QtGlobal> #include <QThread> #include <QCoreApplication> #include <QtConcurrent/QtConcurrent> #include "spydriver_thread.h" #include "shared.h" #include "mainwindow.h" #include "ui_mainwindow.h" void SpyDriver_ShowViewThread::on_InsertPacket (int in_Packet) { char PacketCounterText [16]; memset (PacketCounterText, 0, sizeof(PacketCounterText)); sprintf (PacketCounterText, "[%05d]", in_Packet); g_MainFormUnit->SessionPacketNumberLabel->setText(QString(PacketCounterText)); // **This causes the memory leak** return; } // --- CONSTRUCTOR --- SpyDriver_ShowViewThread::SpyDriver_ShowViewThread() { return; } // --- DECONSTRUCTOR --- SpyDriver_ShowViewThread::~SpyDriver_ShowViewThread() { // free resources return; }
mainwindow.h
#ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMainWindow> QT_BEGIN_NAMESPACE namespace Ui { class MainWindow; } QT_END_NAMESPACE class MainWindow : public QMainWindow { Q_OBJECT public: MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_StartThreadButton_clicked(); private: Ui::MainWindow *ui; }; #endif // MAINWINDOW_H
spydriver_thread.h
#ifndef __MULTISERIAL_SPYDRIVER_THREAD_H__ #define __MULTISERIAL_SPYDRIVER_THREAD_H__ #include <QtCore> // Qt Includes #include <QtGlobal> #include <QThread> #include <QCoreApplication> #include <QtConcurrent/QtConcurrent> #include <stdio.h> class SpyDriver_ShowViewThread : public QThread { Q_OBJECT void run() override { int i = 0; while (1) { emit InsertPacket (i); i++; } } public: SpyDriver_ShowViewThread(); ~SpyDriver_ShowViewThread(); public slots: void on_InsertPacket (int in_Packet); signals: void InsertPacket (int in_Packet); private: }; #endif
shared.h
#ifndef SHARED_H #define SHARED_H #include "mainwindow.h" extern Ui::MainWindow * g_MainFormUnit; #endif // SHARED_H
内容的提问来源于stack exchange,提问作者Rick64
相关产品推荐
相关产品推荐

