我对以下代码有问题:
#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检查时:
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的实现是私有的,因此没有办法调用它。有人可能会认为这不是真正的内存泄漏,因为每个图像格式只有一个键,但在我看来,正确的做法应该是在退出之前能够清除所有内容。
因此我的问题是:有没有办法做到这一点?