確保されたメモリーを残らず確認したいのさ!
ある処理をするたびにメモリーがガンガン消費されて行くぅ~。
だからって、メモリーリークが発生している訳ではありません…。
どのようにメモリーが確保されているか良く分からん…。
と言う訳で現在どのようにメモリーが使用されているかを
確認できると嬉しいなぁ~♪
なんて思いましたよ!
「_CrtMemDumpAllObjectsSince」辺りを使えば何とかなるかと思いきや…
どうも一括表示には向かないみたい…。
そう言えばメモリーリークをチェックできるんだからその辺を引っこ抜けば…
と思い当たって調べてみる…。
メモリーデバッグ情報の大元は、
「C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\DBGHEAP.C」
の中の「static _CrtMemBlockHeader * _pFirstBlock;」だったりする…。
「static」なので外部からアクセスできない…。(泣)
…書き換えるなんて…
論外です!<と言っておきます!
でも、何らかの逃げの処理があるはず!と探すと…
内部データをコピーしてくれる「_CrtMemCheckpoint( );」がありましたよ。
でも「_CrtMemBlockHeader」構造体を参照できない。
「C:\Program Files\Microsoft Visual Studio\VC98\CRT\SRC\DBGINT.H」
の中にあるのだがインクルードしても
「#error : ERROR: Use of C runtime library internal header file.」
なんてエラーをぺって吐きやがる!
仕方が無いので引っこ抜きました…。
※ちなみに「VC++6」だよ。
//--------------------------------------
#define _CRTDBG_MAP_ALLOC
#include<stdio.h>
#include<malloc.h>
#include<crtdbg.h>
//--------------------------------------
#define nNoMansLandSize 4
typedef struct _CrtMemBlockHeader
{
struct _CrtMemBlockHeader *pBlockHeaderNext;
struct _CrtMemBlockHeader *pBlockHeaderPrev;
char *szFileName;
int nLine;
size_t nDataSize;
int nBlockUse;
long lRequest;
unsigned char gap[nNoMansLandSize];
} _CrtMemBlockHeader;
//--------------------------------------
void MemoeyDumpToFile( void )
{
static int Flag = 0;
_CrtMemBlockHeader *Header;
_CrtMemState State;
FILE *File;
_CrtMemCheckpoint( &State );
File = fopen( "Memory.log", Flag ? "a" : "w" );
Flag = 1;
fprintf( File, "========================================\n" );
fprintf( File, "■ size = %d BYTE / cont = %d / total = %d / wait = %d\n", State.lSizes[1], State.lCounts[1], State.lTotalCount, State.lSizes, State.lHighWaterCount );
for( Header = State.pBlockHeader ; Header != NULL ; Header = Header->pBlockHeaderNext )
{
if( Header->nBlockUse == _CRT_BLOCK )
continue;
fprintf( File, "%s : %d : %d BYTE( %d BLOCK)-# %d\n", Header->szFileName, Header->nLine, Header->nDataSize, Header->nBlockUse, Header->lRequest );
}
fprintf( File, "----------------------------------------\n" );
fclose( File );
}
//--------------------------------------
void main( void )
{
int i;
void *a[10];
for( i = 0 ; i < 10 ; i++ )
a[i] = malloc( 100 + i );
MemoeyDumpToFile( );
for( i = 0 ; i < 10 ; i++ )
free( a[i] );
MemoeyDumpToFile( );
for( i = 0 ; i < 3 ; i++ )
a[i] = malloc( 100 + i );
MemoeyDumpToFile( );
for( i = 0 ; i < 3 ; i++ )
free( a[i] );
MemoeyDumpToFile( );
}
結果は、こんな感じ。
========================================
■ size = 1045 BYTE / cont = 10 / total = 6761 / wait = 1244896
c:\test\memoeydumptofile.cpp : 83 : 109 BYTE( 1 BLOCK)-# 49
c:\test\memoeydumptofile.cpp : 83 : 108 BYTE( 1 BLOCK)-# 48
c:\test\memoeydumptofile.cpp : 83 : 107 BYTE( 1 BLOCK)-# 47
c:\test\memoeydumptofile.cpp : 83 : 106 BYTE( 1 BLOCK)-# 46
c:\test\memoeydumptofile.cpp : 83 : 105 BYTE( 1 BLOCK)-# 45
c:\test\memoeydumptofile.cpp : 83 : 104 BYTE( 1 BLOCK)-# 44
c:\test\memoeydumptofile.cpp : 83 : 103 BYTE( 1 BLOCK)-# 43
c:\test\memoeydumptofile.cpp : 83 : 102 BYTE( 1 BLOCK)-# 42
c:\test\memoeydumptofile.cpp : 83 : 101 BYTE( 1 BLOCK)-# 41
c:\test\memoeydumptofile.cpp : 83 : 100 BYTE( 1 BLOCK)-# 40
----------------------------------------
========================================
■ size = 0 BYTE / cont = 0 / total = 10857 / wait = 1244896
----------------------------------------
========================================
■ size = 303 BYTE / cont = 3 / total = 15256 / wait = 1244896
c:\test\memoeydumptofile.cpp : 93 : 102 BYTE( 1 BLOCK)-# 54
c:\test\memoeydumptofile.cpp : 93 : 101 BYTE( 1 BLOCK)-# 53
c:\test\memoeydumptofile.cpp : 93 : 100 BYTE( 1 BLOCK)-# 52
----------------------------------------
========================================
■ size = 0 BYTE / cont = 0 / total = 19352 / wait = 1244896
----------------------------------------
目的は、達成できたみたい。
実際に組み込んでテストしてみた。
どうやら個々に細かくメモリー確保&開放を行ったために
メモリー全体が断片化していっているみたいです。
使用しているメモリー容量は変わっていないみたいだし…。
一度確保したメモリーを完全に開放してから
確保し直した方が良さそうです…。<色々な事情から難しそう…。
前向きに検討ですかね…。
後ろ向きに剣道ですかね…。(笑)
ああ、バンブー終わっちゃったし~。
ARIAも灯里がああなって終わるとは~。
まあ、お陰で早く寝られそうです…。(爆)
| 固定リンク
コメント