232,518 |
Yesterday: 23 Today: 7
connected: via IPv4
Windowsで開発を行っている際に、どうしても逃れきれない問題があります。
皆さんも悩まされたことがおありだと思いますが、メモリリークのことです。今までは、MFCでのメモリーリークを公開していましたが、
今回C++とSDKオンリーのプログラム(非MFC)でもメモリリークをVC上で検出できるようにしました。
(CとSDKオンリーはまだチェックしていませんが、_Crt...関数を使えば出来そうな気もします。)
追加 (2001/05/23)
今までの分は嘘っぱちでした…大変ご迷惑をおかけしました。 m(__)m
なお SDK オンリーの C++ では確認できました。
C オンリーのプログラムでもデバッグ用のマクロを使用すればできるかもしれません ソースファイルはこちらからダウンロードしてください。 Download
- すべてのソースファイルから chkMemoryLeak.hpp をインクルードしてください。
- あと、プロジェクトに chkMemoryLeak.hpp と chkMemoryLeak.cpp を追加してください。
- 非MFCなら WinMain に
#if defined(_DEBUG) // メモリリーク検出用 ::_CrtSetDbgFlag( _CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF // | _CRTDBG_CHECK_ALWAYS_DF ); #endifを追加してください。- MFCを使っている場合は、追加する必要がありません。(MFCの中ですでに行われています。)
- プログラムを実行して、終了させてみてください。
- メモリリークが発生しているようであれば、VCのデバッグウィンドウに結果が表示されているはずです。(出力結果の詳細はMFCでのメモリリークの検出方法を参考にしてください。)
// chkMemoryLeak.hpp #if !defined(CHKMEMORYLEAK_HPP__INCLUDED_) #define CHKMEMORYLEAK_HPP__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #ifdef __AFXWIN_H__ // MFCのウィンドウを使う場合に限定しています #ifdef _DEBUG #pragma message("以下の五行をソースコードの最初に書いてください") #pragma message(" #ifdef _DEBUG") #pragma message(" #define new DEBUG_NEW") #pragma message (" #undef THIS_FILE") #pragma message (" static char THIS_FILE[] = __FILE__;") #pragma message(" #endif") #endif #else #if defined(_DEBUG) #define _CRTDBG_MAP_ALLOC // Macros for setting or clearing bits in the CRT debug flag #ifdef _DEBUG #define SET_CRT_DEBUG_FIELD(a) _CrtSetDbgFlag((a) | _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)) #define CLEAR_CRT_DEBUG_FIELD(a) _CrtSetDbgFlag(~(a) & _CrtSetDbgFlag(_CRTDBG_REPORT_FLAG)) #else #define SET_CRT_DEBUG_FIELD(a) ((void) 0) #define CLEAR_CRT_DEBUG_FIELD(a) ((void) 0) #endif void* operator new(size_t size, const char *filename, int linenumber); void operator delete(void * _P, const char *filename, int linenumber); #pragma message("以下の4行を各ソースコードの最初に書いてください") #pragma message(" #ifdef _DEBUG") #pragma message(" #define DEBUG_NEW new(__FILE__, __LINE__)") #pragma message(" #define new DEBUG_NEW") #pragma message(" #endif") #pragma message("以下の三行はプログラムの最初に実行してください") #pragma message(" #ifdef _DEBUG") #pragma message(" ::_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);") #pragma message(" #endif") #endif #include#include #endif #endif //CHKMEMORYLEAK_HPP__INCLUDED_ // chkMemoryLeak.cpp #include "stdafx.h" #include "chkMemoryLeak.h" #ifdef __AFXWIN_H__ // MFCのウィンドウを使う場合に限定しています #else #if defined(_DEBUG) #define __chkMemoryLeak_H__ void* operator new(size_t size, const char *filename, int linenumber) { return _malloc_dbg(size, _NORMAL_BLOCK, filename, linenumber); } void operator delete(void * _P, const char *filename, int linenumber) { _free_dbg(_P, _NORMAL_BLOCK); return; } #endif #endif
last update at 2010/11/09 19:17:07