SendMessage(WM_COPYDATA)によるメモリリーク – プログラミング – Home

通知
すべてクリア

[解決済] SendMessage(WM_COPYDATA)によるメモリリーク


babyface
 babyface
(@babyface)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

環境は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

このようなご経験のある方、もしくは気になる点がある方がありましたら、
ご教授願います。


引用未解決
トピックタグ
YuO
 YuO
(@YuO)
ゲスト
結合: 24年前
投稿: 252
 

処理の間でヒープから確保したメモリは全て解放していますか?

特に自動変数がヒープから確保していると,

実際にはリークしていなくてもリークしているとされている可能性があります。


返信引用
babyface
 babyface
(@babyface)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

早速のご返事ありがとうございます。
new や alloc した変数はすべて解放しています。
自動変数がヒープから確保ということは、防げないということなのでしょうか?


返信引用
babyface
 babyface
(@babyface)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

追記です。

#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

上記でも、メモリリークしている感じです。
このプロセスではない可能性もありますでしょうか?
ちなみにこの処理はデータ量によりループしているため、
ヒートラン状態にしていて発覚しました。


返信引用
babyface
 babyface
(@babyface)
ゲスト
結合: 22年前
投稿: 10
Topic starter  

別の部分でのメモリリークを見つけました。

CString型変数 = CTime型.Format(...);

としているところがありました。

両方ともCStringなので、平気かと思っていましたが、
MSDNを見たところ、メモリ不足を招く恐れがあるみたいでした。

ご迷惑お掛けしました。

ご返事頂いた方、ありがとうございました。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました