- - PR -
VC++.netでのメモリリークについて教えてください
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-06-09 22:30
こんにちは。メモリリークについてご教授ください。
VC++.netでアプリケーションを作成しました。 もともとVisualStudio6.0で作成されていたものをアップグレードウィザードで .net版にしたものです。 一日中アプリケーションを稼動させてメモリの動向を確認してみると確実にリークしていることがわかりました。 そこで_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF) を使用してメモリリークしている所の洗い出しを行いました。 すると typedef struct transsys{ char TermID[ LEN_SYS_MEN + 1 ]; ・ ・ }TRANS_SYS; というように構造体定義したchar型のメンバがリークダンプに残っているようです。 様々情報を調べるとVC++のメモリリークの主な原因はnewしたものの解放のし忘れ ということなのですが、今回のひっかかっていると思われる構造体はNewで変数定義 したのではなく昔のまま TRANS_SYS transsys; と変数宣言しmemset(&transsys,0,sizeof(TRANS_SYS));で初期化したものになります。 そこで明示的にメモリの解放が必要なのかと思い、 delete(&transsys); を行うとコンパイルは通るのですが実行時にエラーになってしまいます。 ご存知の方、メモリリーク解決方法をどうか教えてください。よろしくお願いします。 | ||||||||
|
投稿日時: 2006-06-10 11:37
.NET での C++ は使ったことがなく、単に昔、少しだけ C++ やメモリーリーク検出ツールを使っただけの知識で書きます。
これは、グローバル変数でしょうか?スタック変数でしょうか? もしグローバル変数(や static な変数)ならば、いつまでたっても消滅しようがないので、ひっかかって当然なのではないでしょうか。 もしスタック変数(メソッド内で宣言する変数)ならば、かならず消滅するはずなので、メモリーリーク検出ツールのほうがおかしい(か使い方がおかしい)可能性があります。
new していないものを delete することはないので、これは当然です。 -- unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86} | ||||||||
|
投稿日時: 2006-06-15 17:31
unibonさん
ご回答ありがとうございます。 これらの変数はメソッド内で宣言されているスタック変数です。 関数を抜けると自然に消滅するはずですよね。 タスクマネージャのメモリを監視していると明らかにメモリが上がっていき 一日アプリを起動しているとメモリが右肩上がりのままなのです。 もしご存知でしたらメモリリークの検出方法を教えていただけますでしょうか。 今試しているのはC++で用意されている_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF)という関数 でメモリリークをダンプしています。ツールは使用してません。 |
1