You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 08:10:27