17

Qt / C ++を使用して大規模なアプリケーションビルドをデバッグしようとしていますが、valgrindは内部Qtのものからの大量のメモリリークを報告しています。誰かがQtアプリ用の適切なvalgrind抑制ファイルを共有できますか?

ありがとう !

例えば。

#include <qobject.h>
int main()
{
  QObject o;
  return 0;
}

戻り値:

$ valgrind --leak-check = full --show-reachable = yes ./leak
== 12655 == Memcheck、メモリエラー検出器
== 12655 == Copyright(C)2002-2009、and GNU GPL'd、by Julian Sewardetal。
== 12655==Valgrind-3.5.0の使用-DebianとLibVEX; 著作権情報については、-hを指定して再実行してください
== 12655 ==コマンド:./リーク
== 12655 ==
== 12655 ==
== 12655 ==ヒープの概要:
== 12655 ==終了時に使用中:7ブロックで744バイト
== 12655 ==合計ヒープ使用量:28の割り当て、21の解放、1,640バイトの割り当て
== 12655 ==
== 12655==1ブロックの16バイトは7の損失レコード1でまだ到達可能です
== 12655 == at 0x4C229C7:演算子new(unsigned long)(vg_replace_malloc.c:220)
== 12655 == by 0x6203124:QThreadData :: current()(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x62FC4BC:QObject :: QObject(QObject *)(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x4008D2:main(in / tmp / Qt / bin / Leak)
== 12655 ==
== 12655==1ブロックの96バイトは7の損失レコード2でまだ到達可能です
== 12655 == at 0x4C229C7:演算子new(unsigned long)(vg_replace_malloc.c:220)
== 12655 == by 0x62030FC:QThreadData :: current()(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x62FC4BC:QObject :: QObject(QObject *)(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x4008D2:main(in / tmp / Qt / bin / Leak)
== 12655 ==
== 12655==1ブロックの96バイトは7の損失レコード3でまだ到達可能です
== 12655 == at 0x4C229C7:演算子new(unsigned long)(vg_replace_malloc.c:220)
== 12655 == by 0x62041CD:QWaitCondition :: QWaitCondition()(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x6200EAF:??? (/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x62010A0:??? (/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x6203132:QThreadData :: current()(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x62FC4BC:QObject :: QObject(QObject *)(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x4008D2:main(in / tmp / Qt / bin / Leak)
== 12655 ==
== 12655==1ブロックの120バイトは7の損失レコード4でまだ到達可能です
== 12655 == at 0x4C229C7:演算子new(unsigned long)(vg_replace_malloc.c:220)
== 12655 == by 0x61FE681:QMutex :: QMutex(QMutex :: RecursionMode)(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x6200DC8:QThreadData :: QThreadData(int)(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x620310C:QThreadData :: current()(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x62FC4BC:QObject :: QObject(QObject *)(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x4008D2:main(in / tmp / Qt / bin / Leak)
== 12655 ==
== 12655==1ブロックの120バイトは7の損失レコード5でまだ到達可能です
== 12655 == at 0x4C229C7:演算子new(unsigned long)(vg_replace_malloc.c:220)
== 12655 == by 0x61FE681:QMutex :: QMutex(QMutex :: RecursionMode)(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x6200DE9:QThreadData :: QThreadData(int)(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x620310C:QThreadData :: current()(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x62FC4BC:QObject :: QObject(QObject *)(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x4008D2:main(in / tmp / Qt / bin / Leak)
== 12655 ==
== 12655==1ブロックの120バイトは7の損失レコード6でまだ到達可能です
== 12655 == at 0x4C229C7:演算子new(unsigned long)(vg_replace_malloc.c:220)
== 12655 == by 0x61FE681:QMutex :: QMutex(QMutex :: RecursionMode)(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x6200E77:??? (/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x62010A0:??? (/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x6203132:QThreadData :: current()(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x62FC4BC:QObject :: QObject(QObject *)(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x4008D2:main(in / tmp / Qt / bin / Leak)
== 12655 ==
== 12655==1ブロックの176バイトは7/7の損失レコードでまだ到達可能です
== 12655 == at 0x4C229C7:演算子new(unsigned long)(vg_replace_malloc.c:220)
== 12655 == by 0x6201092:??? (/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x6203132:QThreadData :: current()(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x62FC4BC:QObject :: QObject(QObject *)(/usr/lib/libQtCore.so.4.5.2内)
== 12655 == by 0x4008D2:main(in / tmp / Qt / bin / Leak)
== 12655 ==
== 12655 ==リークの概要:
== 12655 ==間違いなく失われました:0ブロックで0バイト
== 12655 ==間接的に失われました:0ブロックで0バイト
== 12655 ==失われる可能性があります:0ブロックで0バイト
== 12655 ==まだ到達可能:7ブロックで744バイト
== 12655 ==抑制:0ブロックで0バイト
== 12655 ==
== 12655 ==検出および抑制されたエラーのカウントについては、-vを指定して再実行します。
== 12655 ==エラーの概要:0コンテキストからの0エラー(抑制:8から8)
4

3 に答える 3

5

--show-reachableは、valgrindがそれを損失レコードと呼んでも、実際にはリークされていないメモリを示します。テストアプリはメモリをリークしません。

この特定のケースでは、valgrindの抑制は必要ありません。他の人にとっては、多分、しかしあなたはあなたのためにそれらの抑制を生成するためにvalgrindの--gen-suppressionsオプションを使うべきです。

于 2009-10-20T13:37:40.103 に答える
3
still reachable: 744 bytes in 7 blocks

QObject o を解放すると?それでも同じ結果が得られますか?

更新: 明確にするために、このメモリは、アプリケーションを閉じるときに OS によって解放されます (したがって、リークではありません)。

ただし、自分のために、メモリを解放するデストラクタを作成することは常に良いことであり、何が割り当てられ、何が割り当て解除されるかを制御できることを知っておくと、常に気分が良くなります。(実際のメモリリークが発生しないように...)

于 2009-10-20T12:22:50.973 に答える
1

上記のvalgrindログは0リークを報告します。つまり、エラーはありません

于 2009-10-20T12:11:02.140 に答える