VC(非MFC)でのメモリリークの検出方法


229,635

Yesterday: 17 Today: 6

connected: via IPv4

VC(非MFC)でのメモリリークの検出方法

Windowsで開発を行っている際に、どうしても逃れきれない問題があります。
皆さんも悩まされたことがおありだと思いますが、メモリリークのことです。

今までは、MFCでのメモリーリークを公開していましたが、
今回C++とSDKオンリーのプログラム(非MFC)でもメモリリークをVC上で検出できるようにしました。
(CとSDKオンリーはまだチェックしていませんが、_Crt...関数を使えば出来そうな気もします。)

追加 (2001/05/23)
今までの分は嘘っぱちでした…大変ご迷惑をおかけしました。 m(__)m
なお SDK オンリーの C++ では確認できました。
C オンリーのプログラムでもデバッグ用のマクロを使用すればできるかもしれません ソースファイルはこちらからダウンロードしてください。 Download

  1. すべてのソースファイルから chkMemoryLeak.hpp をインクルードしてください。
  2. あと、プロジェクトに chkMemoryLeak.hpp と chkMemoryLeak.cpp を追加してください。
  1. プログラムを実行して、終了させてみてください。
  2. メモリリークが発生しているようであれば、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