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)
我认为你不是简单地更新你的图像,而是创建一个新的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()函数,而不是在每次迭代时创建一个新函数.