我在这段代码的某处遇到了奇怪的内存泄漏。该方法是连接到另一个线程中的方法的 SLOT。它做了两件事:1 它用另一个线程正在进行的迭代更新文本框。 2 它将 GUI 上显示的图像更新为与该迭代对应的图像。
它适用于 10-30 次迭代,然后就崩溃了。在任务管理器中观察它的内存使用情况,我可以看到它一开始是稳定的,然后每次迭代都会增加大约 10% 的 RAM 使用量。我该怎么做才能消除泄漏?
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;
}
有问题的插槽:
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);
}
最佳答案
我认为您不只是简单地更新图像,而是通过以下方式为场景创建新的像素图项目:
void Transition::onCounterChanged(QString counter)
{
[..]
imageObject->load(filename);
image = QPixmap::fromImage(*imageObject);
scene->addPixmap(image); // <----- Adds new pixmap item to the scene
[..]
}
因此,经过 10-30 次迭代后,您的场景中就有 10-30 个像素图项目。我认为,您必须使用 QGraphicsPixmapItem::setPixmap()
函数更新现有的 QGraphicsPixmapItem
,而不是在每次迭代时创建一个新函数。
关于c++ - 使用QPixmap的Qt内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26612391/