QImage和valgrind;内存泄漏

时间:2012-08-13 15:13:24

标签: qt valgrind

我遇到以下代码的问题:

#include <QtGui/QImage>

int main(int argc, char* argv[]) {
  QImage qimage(100, 100, QImage::Format_ARGB32);
  qimage.fill(Qt::white);
  qimage.save("test.png", "PNG", 70);

  return 0;
}

编译如下:

gcc -I/usr/include/qt4 test.cpp -lQtGui

代码生成正确的图像。然而,当我讨价还价时:

valgrind --leak-check=full ./a.out

它会产生一系列丢失的块,如下所示:

==5974== 158 (56 direct, 102 indirect) bytes in 1 blocks are definitely lost in loss record 54 of 79
==5974==    at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==5974==    by 0x4E4E427: QLibraryPrivate::findOrCreate(QString const&, QString const&) (qlibrary.cpp:437)
==5974==    by 0x4E4E721: QLibrary::setFileNameAndVersion(QString const&, QString const&) (qlibrary.cpp:1110)
==5974==    by 0x56290DF: ???

或者这个:

==5974== 396 (56 direct, 340 indirect) bytes in 1 blocks are definitely lost in loss record 61 of 79
==5974==    at 0x402B9B4: operator new(unsigned int) (in /usr/lib/valgrind/vgpreload_memcheck-x86-linux.so)
==5974==    by 0x4E4E427: QLibraryPrivate::findOrCreate(QString const&, QString const&) (qlibrary.cpp:437)
==5974==    by 0x4E44FB6: QFactoryLoader::updateDir(QString const&, QSettings&) (qfactoryloader.cpp:145)
==5974==    by 0x56F9E67: ???

我为您提供完整的日志,您可以在家中执行相同的操作:)

我试图理解,它们似乎位于我在QImageWriter源代码中找到的以下几行:

QFactoryLoader *l = loader();
QStringList keys = l->keys();

在我看来,当你第一次尝试生成PNG图像时,它会构建一些在每次构建PNG图像时都会重复使用的内容,并且永远不会释放内存。 QFactoryLoader的析构函数似乎知道如何清理东西,我很乐意亲自做delete l;但是没有办法调用它,因为QFactoryLoader是Qt实现的私有。

有人可能会说这不是一个真正的内存泄漏,因为每个图像格式只有一个密钥,但imho,干净的方法就是能够在退出之前清除所有内容。

所以我的问题:有没有办法做到这一点?

2 个答案:

答案 0 :(得分:1)

Qt的图像I / O功能基于插件。当您请求QImage加载png文件时,PNG库将作为QObject 加载,在程序退出之前不会卸载它 - 这是Valgrind看到的作为记忆泄漏。

答案 1 :(得分:-2)

为什么不使用QCoreApplication。只有这样QObject GC才会起作用。只有这样才能正常清理。 Qt是内部构建的,它由太多的指针组成,这些指针由主事件循环管理,而且它完全是凌乱和破坏性的。