dポイントプレゼントキャンペーン実施中!

VB初心者の者です。
VBのプログラムでメモリーリークを起こしているようなので、その調査の為VBでメモリー使用量のログファイルを作成したいのですが、どのタイミングでどのような情報を書き込めば良いのか悩んでいます。パフォーマンスモニターではずっと画面を見続けなければいけないので、プログラムで情報を書き出したいのですが・・・
参考になるプログラムがあれば助かります。
OSはWin2000です。
どうぞよろしくお願い致します。

A 回答 (5件)

>変数など確保した領域を解放するにはどうすればよろしいのでしょうか?



1)オブジェクトの破棄:
Set XXX = YYY で作成したオブジェクトを
使用しなくなった時点で
Set XXX = Nothing を行う

2)動的配列の破棄:
Public[Private等] XXX() As YYY で作成した配列を
使用しなくなった時点で
Erase XXX を行う

3)No3の方の補足:
「破棄」をきちんとされていないと Unload 命令等が書いてあろうが「Terminate」イベントは実行されません。
よってコード上にUnload等が書かれているからと手を抜くことは好ましくありません。No3の方がおっしゃられるようにきちんと監視するべきです。

4)No2の方の補足:
オブジェクトの循環参照での「プログラムが終了するまで」とはタスクマネージャから消去されるまでのことです。Windowが閉じたからといって「終了」したと勘違いしないでください。
循環参照が使われるということはそのWindowが「独立した状況」が作られるということと同意ですので、親オブジェクトを消したからといって、その下にあるオブジェクトが全て消去されるわけではありません。

5)余計なおせっかい
修正する場合には「Form_Load[Initialize等]」イベントが変なところで走らないように注意してください。Unloadしたはずが再Loadされてたという状況が起こる可能性は非常に高くなっています。
    • good
    • 0
この回答へのお礼

ご返事遅くなりまして申し訳ありません。
詳細に説明して頂き、初心者の私にはすごく助かります。
ご回答の内容を参考に調査してみたいと思います。
またお尋ねすることがあるかと思いますのでその時はよろしくお願い致します。

お礼日時:2003/06/15 23:05

予算が許すなら、パフォーマンス測定ツール、テストツールを購入するとよいでしょう。


雑誌等にもよく広告が出ています。
価格は数10万~100万ぐらいです。
    • good
    • 0
この回答へのお礼

ご返事遅くなりまして申し訳ありません。
お金がないのでテストツールの購入は見送りたいと思います。
ありがとうございました。

お礼日時:2003/06/15 23:01

オブジェクト生成時と破棄時に、それぞれ


  「Initialize」イベント
  「Terminate」イベント
が発生するので、
そこにDebug.Printでも入れて監視して
みてはどうでしょうか。

 「Terminate」されずに延々と残っている
オブジェクトがあったとしたら、それが怪しい、
ということで。

もっとも、
外部のDLLを使ってる場合はDebug.Print入れられ
ないのでもう一工夫必要かも。
    • good
    • 0
この回答へのお礼

ご返事遅くなりまし申し訳ありません。
Debug.Printは使ったことがないのですが、HELPを見て組み込んでみます。
ありがとうございます。

お礼日時:2003/06/15 22:59

良くあるのは


○オブジェクトの開放し忘れ
→処理の終わりに、正しくオブジェクトを開放する。
 終了用のメソッド(.Closeなど)がある場合は必ずそれを実行する。
 特に、エラー処理に飛んだ場合や Exit Functionする場合にありがちですね。
 あと、何の考えもなしに Endステートメントを実行している箇所などもチェックしてみるといいかも。

○オブジェクトの循環参照
→AオブジェクトがBオブジェクトを参照し、BオブジェクトがAオブジェクトを参照するような場合。

---A.CLS ---
dim mobjB as object

sub class_initialize
  set mobjB = new B
  mobjB.Atatch Me
end sub
---End of A.CLS---

---B.CLS---
dim mobjA as object
sub Atatch(objA as object)
  set mobjA = objA
end sub
---End of B.CLS---

こんな感じのコードを書くと、mobjA, mobjBに割り当てられた領域は、プログラムが終了するまで開放されません。

○不適切なプロパティのクラスを使用している。
→ActiveX DLLのプロジェクト中で、InstancingがMutliUseになっているクラスをNewしてしまっているとか…
    • good
    • 0
この回答へのお礼

ご返事遅くなりまして申し訳ありません。
大変参考になるコメントありがとうございます。
ご回答内容を参考に調査してみます。

お礼日時:2003/06/15 22:57

メモリーリークというのは、変数など確保した領域を解放してないから 起きるものです。


それらを ちゃんと確認すれば大丈夫です。

また、どれが領域を確保しているかも知る必要がありますね。
    • good
    • 0
この回答へのお礼

早速のご回答ありがとうございます。
ちなみに変数など確保した領域を解放するにはどうすればよろしいのでしょうか?。closeとか言うコマンドがあるのですか?。すみません初心者で良くわからないもので。

お礼日時:2003/06/08 16:39

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!