• ベストアンサー

VBのプログラムミング

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

質問者が選んだベストアンサー

  • ベストアンサー
  • absurd0rt
  • ベストアンサー率23% (4/17)
回答No.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されてたという状況が起こる可能性は非常に高くなっています。

hfc
質問者

お礼

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

その他の回答 (4)

noname#4564
noname#4564
回答No.4

予算が許すなら、パフォーマンス測定ツール、テストツールを購入するとよいでしょう。 雑誌等にもよく広告が出ています。 価格は数10万~100万ぐらいです。

hfc
質問者

お礼

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

  • katyua
  • ベストアンサー率66% (2/3)
回答No.3

オブジェクト生成時と破棄時に、それぞれ   「Initialize」イベント   「Terminate」イベント が発生するので、 そこにDebug.Printでも入れて監視して みてはどうでしょうか。  「Terminate」されずに延々と残っている オブジェクトがあったとしたら、それが怪しい、 ということで。 もっとも、 外部のDLLを使ってる場合はDebug.Print入れられ ないのでもう一工夫必要かも。

hfc
質問者

お礼

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

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.2

良くあるのは ○オブジェクトの開放し忘れ →処理の終わりに、正しくオブジェクトを開放する。  終了用のメソッド(.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してしまっているとか…

hfc
質問者

お礼

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

  • taknt
  • ベストアンサー率19% (1556/7783)
回答No.1

メモリーリークというのは、変数など確保した領域を解放してないから 起きるものです。 それらを ちゃんと確認すれば大丈夫です。 また、どれが領域を確保しているかも知る必要がありますね。

hfc
質問者

お礼

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

関連するQ&A