Qt内存泄漏使用QPixmap

use*_*316 3 c++ qt memory-leaks

我在这段代码中的某个地方发现了一个奇怪的内存泄漏.该方法是SLOT连接到另一个线程中的方法.它做了两件事:1它用另一个线程所在的迭代更新一个文本框.2它将GUI上显示的图像更新为与该迭代对应的图像.

它适用于10-30次迭代,然后爆炸.在任务管理器中查看其内存使用情况,我可以看到它在开始时是稳定的,然后每次迭代都会将RAM使用量增加大约10%.我该怎么做才能消除泄漏?

Transition::Transition(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::Transition)

    {
    ui->setupUi(this);
    this->files = files;
    imageObject = new QImage();
    scene = new QGraphicsScene(this);
}

Transition::~Transition()
{
    delete ui;
    delete imageObject;
    delete scene;
}
Run Code Online (Sandbox Code Playgroud)

有问题的SLOT:

void Transition::onCounterChanged(QString counter){
    ui->imageCounter->setText(counter);
    foldername = ui ->folderName->toPlainText();
    int m = counter.toInt();
    QString filename = files[m];
    imageObject->load(filename);
    image = QPixmap::fromImage(*imageObject);

    scene->clear();//THIS FIXES THE LEAK

    scene->addPixmap(image);
    ui->picDisplay->setScene(scene);
    ui->picDisplay->fitInView(image.rect(),Qt::IgnoreAspectRatio);
}
Run Code Online (Sandbox Code Playgroud)

vah*_*cho 5

我认为你不是简单地更新你的图像,而是创建一个新的pixmap项目到场景:

void Transition::onCounterChanged(QString counter)
{
    [..]
    imageObject->load(filename);
    image = QPixmap::fromImage(*imageObject);
    scene->addPixmap(image); // <----- Adds new pixmap item to the scene
    [..]
}
Run Code Online (Sandbox Code Playgroud)

因此,在10-30次迭代后,您的场景中有10-30个像素图项目.我认为,您必须更新现有的QGraphicsPixmapItem使用QGraphicsPixmapItem::setPixmap()函数,而不是在每次迭代时创建一个新函数.

  • 我不知道在这种情况下如何使用 `QGraphicsPixMapItem`,但是将 `scene-&gt;clear();` 放在 `scene-&gt;addPixmap(image);` 之上似乎可以工作。感谢您发现泄漏 (2认同)