3

次のコードに問題があります。

#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つしかないため、これは実際のメモリリークではないと主張することもできますが、私見では、終了する前にすべてをクリアできるようにするのがクリーンな方法です。

だから私の質問:それを行う方法はありますか?

4

2 に答える 2

1

Qt のイメージ I/O 機能は、プラグインに基づいています。QImagepng ファイルのロードを要求すると、PNG ライブラリはQObject onceとしてロードされ、プログラムが終了するまでアンロードされません。これは、Valgrind がメモリ リークと見なすものです。

于 2012-08-13T16:18:15.880 に答える
-2

QCoreApplication を使用しないのはなぜですか。そうして初めて QObject GC が動作します。そうして初めて、適切なクリーンアップが機能します。Qt は、メイン イベント ループによって管理されるあまりにも多くのポインターを中心に内部的に構築されています。

于 2012-08-13T15:53:27.380 に答える