次のコードに問題があります。
#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の実装専用であるため、呼び出す方法はありません。
画像形式ごとにキーが1つしかないため、これは実際のメモリリークではないと主張することもできますが、私見では、終了する前にすべてをクリアできるようにするのがクリーンな方法です。
だから私の質問:それを行う方法はありますか?