| 『楽しく!』『できる!!』C講座のページ |
|
今回はVC++を用いたメモリリークチェックについてまとめます。 new/delete や malloc/free のような動的にメモリをヒープ領域に確保する関数を使用するときに常につきまとうのがメモリリークの危険性です。 確保したメモリの解放忘れはもちろん、プログラミングが不正処理で終了した場合にもメモリは解放されなくなります。 ここで取り上げるのは解放忘れなどによるメモリリークをチェックする方法についてです。 |
|
int main() { new int return 0; } |
|
int* GetNum(int n); int main() { int* pNum; pNum = GetNum(3); printf("Num=%d", *(pNum)); return 0; } int* GetNum(int n) { int* p_num; p_num = new int; *(pNum) = n; return p_num; } |
| _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); |
|
#include <crtdbg.h> |
|
アウトプットウィンドウ Dumping objects -> c:\program files\microsoft visual studio\vc98\include\crtdbg.h(552) : {16} normal block at 0x00780EC0, 4 bytes long. Data: < > CD CD CD CD Object dump complete. |
|
#include <cstdlib> #include <new> #include <memory> using namespace std; #include <crtdbg.h> // crtdbg.h をインクルードしたあとに _CRTDBG_MAP_ALLOC を //定義してやる #define _CRTDBG_MAP_ALLOC #define NEW ::new(_NORMAL_BLOCK, __FILE__, __LINE__) int main() { _CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF); NEW int; return 0; } |
|
アウトプットウィンドウ Detected memory leaks! Dumping objects -> C:\MyProjects\MemleakTest\Test.cpp(17) : {16} normal block at 0x00780EC0, 4 bytes long. Data: < > CD CD CD CD Object dump complete. |