![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
エクセルのVBAの標準モジュール...
-
VBからPDFファイル自動生成...
-
Acces2002のエラーメッセ...
-
VBで引数にDictionaryオブジェ...
-
横軸ラベルの追加に関するエラ...
-
EXCEL VBA オートシェイプナン...
-
AccessVBA NULLについて
-
VBAで Set wb = Sheets(1).Cop...
-
VBA (Row とRowsの違いについて)
-
Excelでフィルタをかけると警告...
-
VBでPDFファイルを編集する
-
エクセルマクロエラー「'Cells'...
-
VBAで既に開いている別アプリケ...
-
Excel VBA グラフを任意sheetに...
-
ASPでExcelファイルを開く場合
-
オブジェクトが見つかりません
-
USBのグループ ポリシー オブジ...
-
AccessVBAで「dim dbs as datab...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
worksheetFunctionクラスのVloo...
-
「Columns("A:C")」の列文字を...
-
実行時エラー 3265「要求された...
-
エクセルのVBAの標準モジュール...
-
VBAで既に開いている別アプリケ...
-
Excelでフィルタをかけると警告...
-
VBAで Set wb = Sheets(1).Cop...
-
VBAからPDFファイルにパスワー...
-
エクセルマクロエラー「'Cells'...
-
PowerPointVBAでスライドマスタ...
-
VBScriptでファイルの日時順(降...
-
[VBA]CDOメッセージ送信エラー
-
ある文字列が全て数字であるか...
-
EXCEL VBA オートシェイプナン...
-
VBAで作成するメール(開封確認...
-
オブジェクトが見つかりません
-
上下の位置揃えについて
-
VBからPDFファイル自動生成...
-
AccessVBAで「dim dbs as datab...
-
テキストボックス中の文字列の...
おすすめ情報