tech::hexagram

personal note for technical issue.

メモリリークの発見Tipsなどなど

Twitterの件,早めにまとめてアップしますm(_ _)m

今日はちょっと別のネタですが,VisualStudio上で,C++でのメモリリークを検出する方法について書いていきたいと思います.

前準備


1:以下をmleak.hとして保存します

#ifndef MEMORY_LEAK_H
#define MEMORY_LEAK_H
#define _CRTDBG_MAP_ALLOC
#include <stdlib.h>
#include <crtdbg.h>
#ifdef _DEBUG
#define new new(_NORMAL_BLOCK,__FILE__,__LINE__)
#endif
#endif

2:これを使用する全てのプログラムにインクルードします

冒頭にインクルードするとエラーが出るかもしれません.

3:メイン関数の冒頭で以下を宣言します

_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF | _CRTDBG_ALLOC_MEM_DF);

これでOKです.

もしメモリリークがある場合,VisualStudioのアウトプットのデバッグタグに,このように表示されるはずです.

Detected memory leaks!

Dumping objects ->

C:.../hogehoge.cpp(20) : {18} normal block at 0x00780E80, 64 bytes long.

Data: <                > CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD CD

Object dump complete.

#define _CRTDBG_MAP_ALL

よく出てくるエラーについて


メモリリークを解消するために色々いじっているとこんな画面に遭遇することがあります.

Debug Assertion Failed!

Program: ...\Debug\pro.exe
File: f:\dd\vctools\crt_bld\self_x86\crt\src\dbgdel.cpp
Line: 52

Expression: _BLOCK_TYPE_IS_VALID(pHead->nBlockUse)

これは解放すべきメモリがないのに解放宣言をしてしまっている場合です.
二重にdelete文をいれていないか,確認してみてください.