1

Visual Studio 2008 を使用して、Windows で Qt 4.5 アプリケーションを構築しています。アプリケーションをデバッグ モードで実行してから閉じると、Visual Studio は次を出力ペインに出力します。

メモリ リークを検出しました。
オブジェクトのダンプ ->
{696512} 通常ブロック 0x01981AB0、長さ 24 バイト。
データ: < > 00 CD CD CD 00 00 00 00 00 00 00 00 00 00 00 00
{696511} 0x02E59B70 の通常ブロック、12 バイト長。
データ: < U2g U2g> B0 1A 98 01 E8 55 32 67 E8 55 32 67

そして、出力は何百ものそのようなブロックを報告します。特に Qt 4 のモデル/ビュー フレームワークを使用しているときに、これに気付きました。Qt には実際にメモリ リークがありますか、それとも Visual Studio がリークを誤って報告する状況はありますか?

4

4 に答える 4

5

メモリ リーク情報は、デバッグ ウィンドウ ランタイムによって提供されます。あなたのプログラムは、これと対話して構成することができます。

括弧内の数字{696512}は割り当て順序番号です。この数値が常に同じである場合は、この数値を に渡すことで、この割り当てにブレーク ポイントを設定できます_CrtSetBreakAlloc。デバッガーでプログラムを再度実行すると、リークしたメモリが割り当てられるとデバッガーが停止します。

この関数は main の早い段階で呼び出します。数値が常に同じでない場合は、常に同じになるまでコードを減らしてメモリ リークを再現してみてください。

詳細については、「CRT ライブラリを使用してメモリ リークを見つける」を参照してください

于 2009-06-18T17:04:06.557 に答える
2

DevPartner を使用してプロジェクトのプロファイルを作成する機会がありました。驚くべきことは、QtGuid4.dll と QtCored4.dll でメモリ リークが報告されていることです。しかし、各ケースを手作業で調べたところ、それらはすべて誤検知であることがわかりました。

補足として、Qt を使用したコードで報告されたメモリ リークはありませんでした。

于 2009-07-27T15:26:55.140 に答える
1

Qt-way で動的メモリを使用していることを確認してください。

#include <QObject>
#include <QString>

class MyClass : public QObject
{
public: 
MyClass (const QString& text, QObject *parent = 0);
...
};


int main()
{
QObject parent;
MyClass *a;
a = new MyClass ("foo", &parent);
...
}

(c) Johan Thelin、「Qt 開発の基礎」

于 2009-06-18T08:37:25.757 に答える
0

これは、QT がクリーンアップを行う前にメモリ リーク検出器がリークをチェックしているときに発生すると思います。qtmaind.lib、QtCored4.lib、QtGuid4.lib、QtOpenGLd4.libなどをVSのプロジェクト設定ダイアログのリンカー依存関係ボックスの一番下に移動することで、この問題を修正しました。

于 2009-09-04T12:37:33.297 に答える