0

いくつかのQtクラスを使用するコンソールプログラムがあります。次のコードはそのフラグメントです

std::cout << "before the problem (PVM constructor)" << std::endl;
image = new QImage(filename);
std::cout << "after the problem (PVM constructor)" << std::endl;

valgrindに対して実行すると、いくつかのエラーがスローされます。

before the problem (PVM constructor)
==8344== Conditional jump or move depends on uninitialised value(s)
==8344==    at 0x51D6D19: inflateReset2 (in /lib/i386-linux-gnu/libz.so.1.2.3.4)
==8344==    by 0x51D6E0C: inflateInit2_ (in /lib/i386-linux-gnu/libz.so.1.2.3.4)
==8344==    by 0x51D6E92: inflateInit_ (in /lib/i386-linux-gnu/libz.so.1.2.3.4)
==8344==    by 0x51B3F60: png_create_read_struct_2 (in /lib/i386-linux-gnu/libpng12.so.0.46.0)
==8344==    by 0x42807AC: QImageReader::read(QImage*) (in /usr/lib/i386-linux-gnu/libQtGui.so.4.7.4)
==8344==    by 0x4021BAF: ???
==8344==  Uninitialised value was created by a heap allocation
==8344==    at 0x4028876: malloc (vg_replace_malloc.c:236)
==8344==    by 0x51C0796: png_malloc_default (in /lib/i386-linux-gnu/libpng12.so.0.46.0)
==8344==    by 0x51C082C: png_malloc (in /lib/i386-linux-gnu/libpng12.so.0.46.0)
==8344==    by 0x51A6A48: ??? (in /lib/i386-linux-gnu/libpng12.so.0.46.0)
==8344==    by 0x51D6DE8: inflateInit2_ (in /lib/i386-linux-gnu/libz.so.1.2.3.4)
==8344==    by 0x51D6E92: inflateInit_ (in /lib/i386-linux-gnu/libz.so.1.2.3.4)
==8344==    by 0x51B3F60: png_create_read_struct_2 (in /lib/i386-linux-gnu/libpng12.so.0.46.0)
==8344==    by 0x42807AC: QImageReader::read(QImage*) (in /usr/lib/i386-linux-gnu/libQtGui.so.4.7.4)
==8344==    by 0x4021BAF: ???
==8344== 
after the problem (PVM constructor)

問題の原因を見つけるのを手伝ってもらえますか?内部のQtライブラリに危険な構造があるのでしょうか?それとも、コンソールプログラム内でQt GUIライブラリを使用するのが問題なのですか(そうは思いませんが、誰が知っていますか)?

4

1 に答える 1

3

Valgrind は、ヒープにメモリを割り当てたが解放しない場合など、メモリ リークが見つかった場合に通知します。delete imageプログラムが完了した後は、電話しないでください。これは、valgrind がメモリ リークとして検出するものです。Qtとは関係ありません。C++ のルールは次のとおりです。すべての新規に対して 1 つの削除があります。

于 2013-01-28T21:30:25.517 に答える