加载图像约500次后,此错误显示在Visual Studio Qimage:不记忆,返回空图像

After loading a image around 500 times , this error shows in visual studio QImage: out of memory, returning null image

本文关键字:图像 Studio Qimage 记忆 返回 Visual 显示 500次 加载 错误      更新时间:2023-10-16

我想在qt标签上显示图像。我正在以QByteArray的形式获得图像数据,并将其加载到标签中。以下是代码:

在构造函数中定义

QPixmap *pixmapTest;
pixmapTest  = NULL;

以下代码在多次被调用的函数中:

    RequestCompleted(QNetworkReply *reply)
{
if(pixmapTest){
    qDebug()<<"delete showImage Pixmap Object";
    delete pixmapTest;
    pixmapTest = NULL;
}
pixmapTest = new QPixmap();
QByteArray jpegData = reply->readAll();
pixmapTest->loadFromData(jpegData);
ui.qtLabel->setPixmap(*pixmapTest);
}

在调用此功能约500次后,我会遇到此错误

QImage: out of memory, returning null image.

我没有得到上述代码中的错误。有人可以告诉我如何解决这个问题吗?

首先在一个被称为多次的函数中为变量(pixmapTest)分配和取消存储器,这是不够有意义的。您应该先分配内存,然后将所有内容分配给它。例如:

pixmapTest = new QPixmap();
for(size_t i = 0; i < 1000; i++){
    // Call that function
}
delete pixmapTest;

除此之外,听起来您的应用程序正在泄漏内存。请注意,通过删除pixmapTest,您不会删除内存jpegData点。因此,在每个功能调用中,您应该照顾jpegData点的内存。

很可能,您没有释放reply本身。

也无需存储PixMap,也无需通过指针进行管理。按值保持价值,并在每次收到答复时分配新值。

例如:

class MyClass : public QWidget {
  Q_OBJECT
  Ui::MyClass ui;
  explicit MyClass(QWidget *parent = nullptr) : QWidget(parent) {
    ui.setupUi(this);
  }
  Q_SLOT void requestCompleted(QNetworkReply *reply) {
    QPixmap pix;
    pix.loadFromData(reply->readAll());
    ui.qtLabel->setPixmap(pix);
    reply->deleteLater();
  }
};