環境はVC6++SP5,Windows2000Pro,MFC(SDI)です。
メモリリークについての質問です。
別プロセスに向けて、WM_COPYDATAでSendMessageをしています。
SendMessageをした直後にメモリリークが大量に発生しています。
ソースは以下の通りです。
memcpy(pMsg,(BYTE*)&stMessageHead,sizeof(MESSAGE_HEAD));
stCds.cbData = sizeof(MESSAGE_HEAD) + stMessageHead.nDataLength;
stCds.dwData = 0;
stCds.lpData = pMsg;
::SendMessage( hWnd, WM_COPYDATA, (WPARAM)hWnd, (LPARAM)&stCds );
pMsgも、きちんと指定領域分(60バイト)確保できています。
cdDataも60バイトであっています。
動作上は正常に動いています。
メモリリークは以下のようにして見つけました。
#ifdef _DEBUG
CMemoryState oldMemState, newMemState, diffMemState;
oldMemState.Checkpoint();
#endif
~処理~
#ifdef _DEBUG
newMemState.Checkpoint();
if( diffMemState.Difference( oldMemState, newMemState ) )
{
//TRACEはdebugモードのみで有効な関数。
//outputの欄に文字列を表示できる。
TRACE( メモリの解放漏れを発見\n );
//outputにどのソースのどの行のオブジェクトが解放されていないか表示される。
diffMemState.DumpAllObjectsSince();
}
#endif
このようなご経験のある方、もしくは気になる点がある方がありましたら、
ご教授願います。
処理の間でヒープから確保したメモリは全て解放していますか?
特に自動変数がヒープから確保していると,
実際にはリークしていなくてもリークしているとされている可能性があります。
早速のご返事ありがとうございます。
new や alloc した変数はすべて解放しています。
自動変数がヒープから確保ということは、防げないということなのでしょうか?
追記です。
#ifdef _DEBUG
CMemoryState oldMemState, newMemState, diffMemState;
oldMemState.Checkpoint();
#endif
SendMessage1行のみ
#ifdef _DEBUG
newMemState.Checkpoint();
if( diffMemState.Difference( oldMemState, newMemState ) )
{
//TRACEはdebugモードのみで有効な関数。
//outputの欄に文字列を表示できる。
TRACE( メモリの解放漏れを発見\n );
//outputにどのソースのどの行のオブジェクトが解放されていないか表示される。
diffMemState.DumpAllObjectsSince();
}
#endif
上記でも、メモリリークしている感じです。
このプロセスではない可能性もありますでしょうか?
ちなみにこの処理はデータ量によりループしているため、
ヒートラン状態にしていて発覚しました。
別の部分でのメモリリークを見つけました。
CString型変数 = CTime型.Format(...);
としているところがありました。
両方ともCStringなので、平気かと思っていましたが、
MSDNを見たところ、メモリ不足を招く恐れがあるみたいでした。
ご迷惑お掛けしました。
ご返事頂いた方、ありがとうございました。