- PR -

VC++.netでのメモリリークについて教えてください

1
投稿者投稿内容
らら
常連さん
会議室デビュー日: 2005/01/21
投稿数: 28
お住まい・勤務地: 埼玉県
投稿日時: 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);
を行うとコンパイルは通るのですが実行時にエラーになってしまいます。

ご存知の方、メモリリーク解決方法をどうか教えてください。よろしくお願いします。
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2006-06-10 11:37
.NET での C++ は使ったことがなく、単に昔、少しだけ C++ やメモリーリーク検出ツールを使っただけの知識で書きます。
引用:

ららさんの書き込み (2006-06-09 22:30) より:
様々情報を調べるとVC++のメモリリークの主な原因はnewしたものの解放のし忘れ
ということなのですが、今回のひっかかっていると思われる構造体はNewで変数定義
したのではなく昔のまま
 TRANS_SYS  transsys;
と変数宣言しmemset(&transsys,0,sizeof(TRANS_SYS));で初期化したものになります。


これは、グローバル変数でしょうか?スタック変数でしょうか?
もしグローバル変数(や static な変数)ならば、いつまでたっても消滅しようがないので、ひっかかって当然なのではないでしょうか。
もしスタック変数(メソッド内で宣言する変数)ならば、かならず消滅するはずなので、メモリーリーク検出ツールのほうがおかしい(か使い方がおかしい)可能性があります。

引用:

ららさんの書き込み (2006-06-09 22:30) より:
そこで明示的にメモリの解放が必要なのかと思い、
delete(&transsys);
を行うとコンパイルは通るのですが実行時にエラーになってしまいます。


new していないものを delete することはないので、これは当然です。

--
unibon {B73D0144-CD2A-11DA-8E06-0050DA15BC86}
らら
常連さん
会議室デビュー日: 2005/01/21
投稿数: 28
お住まい・勤務地: 埼玉県
投稿日時: 2006-06-15 17:31
unibonさん

ご回答ありがとうございます。
これらの変数はメソッド内で宣言されているスタック変数です。
関数を抜けると自然に消滅するはずですよね。

タスクマネージャのメモリを監視していると明らかにメモリが上がっていき
一日アプリを起動しているとメモリが右肩上がりのままなのです。

もしご存知でしたらメモリリークの検出方法を教えていただけますでしょうか。
今試しているのはC++で用意されている_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF|_CRTDBG_LEAK_CHECK_DF)という関数
でメモリリークをダンプしています。ツールは使用してません。
1

スキルアップ/キャリアアップ(JOB@IT)