加载图像大约500次后,此错误显示在visual studio QImage中:内存不足,返回空图像

时间:2016-12-21 16:36:39

标签: c++ qt qimage qbytearray

我想在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.

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

2 个答案:

答案 0 :(得分:1)

首先,在多次调用的函数中为变量(pixmapTest)分配和取消分配内存是不够的。您应该先分配内存,然后在完成所有内容后重新分配内存。例如:

pixmapTest = new QPixmap();

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

delete pixmapTest;

除此之外,听起来你的应用程序正在泄漏内存。请注意,通过删除pixmapTest,您不会删除指向的内存jpegData。因此,在每个函数调用中,您应该处理jpegData指向的内存。

答案 1 :(得分:0)

最有可能的是,您并没有释放reply本身。

也不需要存储像素图,也不需要通过指针管理像素图。按值保留,并在每次收到回复时分配新值。

E.g:

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();
  }
};