【问题标题】:After loading a image around 500 times , this error shows in visual studio QImage: out of memory, returning null image加载图像大约 500 次后,Visual Studio QImage 中显示此错误:内存不足,返回空图像
【发布时间】:2017-05-07 03:58:19
【问题描述】:

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

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

【问题讨论】:

  • 听起来你正在泄漏内存。大概是jpegData...
  • 每次创建一个新的像素图对象似乎很奇怪,最好创建一次pixmapTest,然后调用loadFromData。另见:stackoverflow.com/questions/15316008/…
  • 我假设您需要在某些时候执行删除(pixMapTest)。或者把它放在像 shared_ptr 这样的智能指针中

标签: c++ qt qimage qbytearray


【解决方案1】:

首先,在多次调用的函数中为变量 (pixmapTest) 分配和取消分配内存是没有意义的。您应该首先分配内存,一旦完成,就取消分配它。例如:

pixmapTest = new QPixmap();

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

delete pixmapTest;

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

【讨论】:

    【解决方案2】:

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

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

    例如:

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

    【讨论】:

    • 在执行此操作时出现这些错误
    • 好吧,也许您收到的数据格式不正确。我们怎么会知道这些?您需要检查它并确保代码有意义。您必须对问题有足够的了解才能知道要问什么问题,而不仅仅是说“嘿,这行不通”。
    • 感谢您的宝贵建议。在问下一个问题之前,我会记住这句话。
    猜你喜欢
    • 1970-01-01
    • 2017-04-16
    • 1970-01-01
    • 2011-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-27
    • 1970-01-01
    相关资源
    最近更新 更多