はじめまして、kanaです。
以下のソースのように、CDialogの派生クラスのnewとdeleteを繰り返すと、
タスクマネージャ上のメモリ使用量が増えていきます。
CChildDialogのOnInitDialog()で、EndDialog(IDCANCEL)を実行している以外は
何も行っていません。
for( int i = 0; i < 10000; i++ )
{
CChildDialog *pDlg = new CChildDialog(this);
pDlg->DoModal();
delete pDlg;
}
Debugモードで動かしてみましたが、メモリリークは検出されませんでした。
どなたか、このような現象が発生する理由をご存じではないでしょうか?
開発環境:VC6.0 MFC
動作環境:WindowsXP SP2, WindowsVista
> タスクマネージャ上のメモリ使用量が増えていきます。
メモリ使用量として何を見ているのかが問題。
そもそも「増えることが悪なのか?」を理解して話してる?
コミットチャージ量が増えても *それだけでは* 何の問題も無い。
提示のソースを見る範囲においてはなんも問題ないですだよ
> どなたか、このような現象が発生する理由をご存じではないでしょうか?
掲示板で説明できる分量ではないのでパス
http://www.exconn.net/Forums/ShowPost.aspx?PostID=9027
tetrapodさん、コメントありがとうございます。
> メモリ使用量として何を見ているのかが問題。
> そもそも「増えることが悪なのか?」を理解して話してる?
> コミットチャージ量が増えても *それだけでは* 何の問題も無い。
すいません、理解できていません。
タスクマネージャ上で使用量が増えていることから、単純に疑問に思い投稿してしまい
ました。
現在、プログラム内のミス(freeのし忘れ等)でメモリーリークが発生していないか
検証するために「Process Explorer」で観察していますが、
Private Bytes、WS Private、WS Shared、Virtual Sizeなど意味がさっぱりわかりませ
ん。
やはりこれらの意味を知る上で、プロセスやスレッドにおけるメモリ管理をきちんと理
解しないといけないのでしょうね。
「インサイド Microsoft Windows 第4版〈上〉」が良書とリンク先や他のHPに書いてあ
りましたので、
勉強しようかと思います。
また、new CChildDialog(this) ではなく単純な配列 new BYTE[10000] で
同様のテストを行ったところ、使用量が増加する現象はみられませんでした。
これはこれでクラスのメモリの確保のされ方などを学ばないといけないでしょうか?
疑問ばかりで申し訳ございませんが、何か少しでも情報をいただければ幸いです。
# モーダルダイアログをわざわざ new する必然って言うのを感じないが
new C**Dialog と new char [NNN] の違いは、クラスかどうかというより
ウィンドウハンドル等のリソースを使うか否かのほうが大きいと思うよ
コミットチャージを減らすだけなら途中でウィンドウを最小化してみるといい
何一つ delete 処理してないのに減るから。
(対象自作 EXE でなくても VisualStudio で試せばいい)
コミットチャージに一喜一憂するのは素人さんだけでいい
まあその素人さんを喜ばせるために小細工するってのはありだけど
http://d.hatena.ne.jp/NyaRuRu/20060730/p1
最小化すると確かに使用メモリが減りました。
なんとか、自分のミスによるメモリリークの検出方法はないものでしょうか。
Microsoftのサイトで以下の情報を見つけました。
http://support.microsoft.com/kb/268343/ja
アプリケーションでメモリ リークが発生していることを確認するには、疑いのあるコー
ドを繰り返しループの中に配置して、Private Bytes と Virtual Bytes におけるメモリ
の増加を監視する必要があります。監視して、Private Bytes と Virtual Bytes バイト
数が最終的に同じにならないことと、バイト数の上昇が停止することを確認します。使
用メモリが上昇しなくなるポイントが存在する (たとえば、使用メモリが無限に上昇を
続けない) 場合、メモリ リークは発生していませんが、一部のキャッシュが最大サイズ
に達している可能性があります。
とりあえず、この情報を信じて検証してみます。
DevParnerなんてツールがありますよ
私は結構気に入ってます
え~いちさん、コメントありがとうございます。
結構高いツールですね。。。
試用できるみたいなので、使ってみます。
C++ メモリリーク ツール
あたりでぐぐったりすると数種類どころではなくヒットするねー
Purify, BoundsChecker, Visual Leak Detector, Insure++, MemProbes
Debug モードの表示では不十分?信頼できない?
まあいろいろ使ってみるといいかも
>> tetrapodさん
情報ありがとうございます。いろいろあるんすね。
自社の試験や客先で、客観的にメモリーリークが発生していないことが
実証できればと思っています。
タスクマネージャのメモリ使用量では、リーク判断の基準になりません
パフォーマンスモニタの「PrivateBytes」を見るべきかと
1.ソフトをブレークポイントなしのDEBUGモードで起動する。
2.kanaさんがこれはと思う操作を何度か繰返す。
3.ソフトを終了する。
4.デバッグウインドウをみて「Memory leak」いう表示があるか確かめる。
5.なければ、問題になるようなメモリーリークはないと判断する。
6.あったときは、必要により、え~いちさんやtetrapodさんの紹介のあった
ツールで調べる。
以上の手順でいいはずです。
メモリーリークは御客さんからの指摘ですか?
そうでなければ、上記のことを行ってよければ、異常ではないと思います。
http://ja.wikipedia.org/wiki/%E3%83%A1%E3%83%A2%E3%83%AA%E3%83%AA%E3%83%BC%E3%
82%AF
参考にどうぞ、
知ってたら無視してください。
>> ITOさん
お客さんからの指摘のときもあります。
マイクロソフトに書かれている方法を試してみましたが、Private Bytes と Virtual
Bytes 共に増えていく状態です。
3日連続で動かしていますが、時間にも限りがありますので、解決していませんがいっ
たん解決とさせていただきます。
ありがとうございました。
私も同じ状況で、顧客に説明を求められています。
ダイアログベースのアプリでは無く、
MFC, VC++6.0環境で作成したWindowsサービスなんですが、
2003Server環境で、Private Bytesの増加が見られます。
(定常時のほうが多いのですが)
Private Bytesって4K単位(4096の倍数)になってますよね?
以下のスレから断片化によるものでは無いかと思ってますが、
公式の文書が無いので、顧客に説明できない状況です。