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されてたという状況が起こる可能性は非常に高くなっています。
ご返事遅くなりまして申し訳ありません。
詳細に説明して頂き、初心者の私にはすごく助かります。
ご回答の内容を参考に調査してみたいと思います。
またお尋ねすることがあるかと思いますのでその時はよろしくお願い致します。
No.3
- 回答日時:
オブジェクト生成時と破棄時に、それぞれ
「Initialize」イベント
「Terminate」イベント
が発生するので、
そこにDebug.Printでも入れて監視して
みてはどうでしょうか。
「Terminate」されずに延々と残っている
オブジェクトがあったとしたら、それが怪しい、
ということで。
もっとも、
外部のDLLを使ってる場合はDebug.Print入れられ
ないのでもう一工夫必要かも。
ご返事遅くなりまし申し訳ありません。
Debug.Printは使ったことがないのですが、HELPを見て組み込んでみます。
ありがとうございます。
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してしまっているとか…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- その他(プログラミング・Web制作) IT初心者です 仕事で、vb.netで作成されたdllをvbaで呼び出すプログラムを作成しろと言われ 1 2023/03/27 08:22
- Visual Basic(VBA) 九九の答えの計算 3 2022/12/20 22:13
- C言語・C++・C# visual studioでフォームデザインを作成する時のVB.netとC#の違い 2 2023/06/22 03:04
- Visual Basic(VBA) VBでExcelの表形式の様なデザインを作りDBと連携させる。 4 2023/02/28 11:39
- Visual Basic(VBA) VBプロジェクトでのフォルダ構成について 1 2023/07/22 03:49
- Microsoft ASP ASP.NETや.NET、C#とかVBとか 2 2022/05/16 21:16
- その他(プログラミング・Web制作) プログラムの勉強のおすすめは 7 2022/12/09 20:09
- 物理学 2物体の単振動 1 2023/08/17 20:27
- デスクトップパソコン 「自動修復でPCを修復できませんでした」と表示されPCが起動しないのですが対処法はありますか? 5 2022/05/13 09:16
- C言語・C++・C# ディスプレイの解像度とマウスの位置について 2 2023/05/21 19:01
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
実行時エラー 3265「要求された...
-
VBAで Set wb = Sheets(1).Cop...
-
エクセルVBAでcode128のバー...
-
横軸ラベルの追加に関するエラ...
-
エクセルのVBAの標準モジュール...
-
VBAについてです。 初心者です...
-
オブジェクト変数の取得について
-
[VBA]CDOメッセージ送信エラー
-
オブジェクトが見つかりません
-
マクロ初心者です。 インデック...
-
VBScriptでファイルの日時順(降...
-
ExcelのVBAについて(グラフ操作)
-
アクセスにてオブジェクト名変...
-
Access VBAとExcel VBAとはどの...
-
C#でオブジェクトの配列を使う
-
オブジェクト名が同じ図形の変更
-
VBAからPDFファイルにパスワー...
-
VBAで作成するメール(開封確認...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
実行時エラー 3265「要求された...
-
Excelでフィルタをかけると警告...
-
VBAで既に開いている別アプリケ...
-
エクセルマクロエラー「'Cells'...
-
テキストボックス中の文字列の...
-
VBAで Set wb = Sheets(1).Cop...
-
ある文字列が全て数字であるか...
-
VBAからPDFファイルにパスワー...
-
VBScriptでファイルの日時順(降...
-
EXCEL VBA オートシェイプナン...
-
[VBA]CDOメッセージ送信エラー
-
エクセルVBAで2つの画像を比較...
-
PowerPointVBAでスライドマスタ...
-
UserForm1.Showでエラーになり...
-
上下の位置揃えについて
-
VBAについてです。 初心者です...
-
VBAで作成するメール(開封確認...
おすすめ情報