2017-08-09 8 views
0

私は、Visual 2017を使用してMFCアプリケーションを書いているアプリケーションを終了するには、デバッグモードでは、私はこれを取得する場合:検出メモリリークが

検出されたメモリリークを!ダンプするオブジェクト - > {74}通常ブロック 0x00000230E49A7000、16バイトです。データ:< 0 0> 30 00 97 E4 30 02 00 00 00 00 00 00 00 00 00オブジェクトのダンプ完了。 CWinApp :: InitInstanceの()内

#define _CRTDBG_MAP_ALLOC 
#include <stdlib.h> 
#include <crtdbg.h> 

をそして、これらの行::

ので、漏れの原因となっている機能を知るために、私はSTDAFX.Hに次の行を追加しました

_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); 
_CrtSetBreakAlloc(74); 

しかし、動作しませんでした。コードが実行される前に74番目のメモリ割り当て番号が作成されていると思われます。どんな方法で最初に呼び出すことができますか?

+0

いつも74ですか? – drescherjm

+0

はい、それは常に74です。私はメモリリークが私のプロジェクトにインポートされた非MFCコードで起こっていることを知りました。しかし、私は_CrtSetDbgFlagがこのコードが実行される前に呼び出されていないと思います。 –

+0

私はこれらの行を外部コードのメインクラスのコンストラクタに入れ、デバッガは(ヒープ上ではなく)スタックにstd :: vectorを割り当てるときに停止します。非常に奇妙な... –

答えて

2

デバッグを開始するには(プログラムの何かが実行される前にデバッガで停止するので、ステップは実行されません)ステップインしてから、停止する割り当てに_crtBreakAllocを設定します(74) 。その後、実行し、74番目の割り当てを中断する必要があります。 CRT Debug Heap Detailsにはこの変数に関する情報があります。このコードは、各実装(.CPP)ファイルの先頭で

#ifdef _DEBUG 
#define new DEBUG_NEW 
#endif 

を書く

+0

私はそれをしましたが、デバッガはプログラムが終了する前に中断しませんでした。 CWinApp :: InitInstance()で_CrtSetDbgFlagを呼び出したので、ヒープ計測はあまりにも遅く起動されていたと思いませんか? –

+0

@ MarkMorrisson Correct。 _CrtSetBreakAllocを呼び出すと、74番目の割り当てが既に発生しているか、プログラムがその74番目の割り当てに到達しません。 – 1201ProgramAlarm

+0

どうすればいいですか? –

0

は、あなたがメモリリークのソースを検出することができます。 も参照:How to detect memory leaks in MFC

+0

私は自分のプロジェクトに多くの外部ファイルを含めているので、stdafx.hの最後にこれらの行を追加しました(これは通常、すべてのソースファイルに含まれています)。 –

関連する問題