始めまして、超初心者で申し訳ありません。教えて下さい。
言語:VB6
以下のようなソースがあり、疑問に思ったことがあります。
CollectionオブジェクトのAddメソッドは、
値をコピーしているのでしょうか?
Set obj = Nothing
と最後にあるのですが、これをしてしまったら、
Collectionに何が格納されるのか、不思議に思いました。
CollectionオブジェクトのAddメソッドは
どのような動作をしているのでしょうか、??
Dim col As Collection
Dim obj As clsSample
Set col = New Collection
Set obj = New clsSample
obj.FieldName = "AAA"
obj.Value = "0001"
Call col.Add(obj, obj.FieldName)
Set obj = Nothing
> CollectionオブジェクトのAddメソッドは、
> 値をコピーしているのでしょうか?
単純な数値等であれば、値そのものがコピーされます。
オブジェクトの場合は、オブジェクトのコピーではなく、
オブジェクトへの参照がコピーされます。
> Set obj = Nothing
この時点で、コレクションが保持していた値やオブジェクトも参照されなくなります。
そのオブジェクトが、どこからも参照されなくなった場合、オブジェクト自体が破棄されます。
たとえば、
======= Class1 ========
Option Explicit
Private Sub Class_Initialize()
Debug.Print "<作成>ID:"; ObjPtr(Me)
End Sub
Private Sub Class_Terminate()
Debug.Print "<破棄>ID:"; ObjPtr(Me)
End Sub
===============
を作っておいた場合、
Debug.Print "--- Begin ---"
Set C = New Collection
Debug.Print "--- Create ---"
Set Item = New Class1
Debug.Print "--- Add ---"
C.Add Item
Debug.Print "--- Add & Create ---"
C.Add New Class1
Debug.Print "--- Nothing ---"
Set C = Nothing
Debug.Print "--- Release ---"
Set Item = Nothing
Debug.Print "--- End ---"
===============
というコードは、たとえば以下のような結果となります。
--- Begin ---
--- Create ---
<作成>ID: 2294536
--- Add ---
--- Add & Create ---
<作成>ID: 2255296
--- Nothing ---
<破棄>ID: 2255296
--- Release ---
<破棄>ID: 2294536
--- End ---
魔界の仮面弁士様
ありがとうございました。
>オブジェクトへの参照がコピーされます。
コレクションオブジェクトにAddした時点で
コレクションオブジェクトがそのオブジェクトを参照する、
という考え方で、正しいでしょうか?
>そのオブジェクトが、どこからも参照されなくなった場合、オブジェクト自体が破棄されます。
また、仮にプログラムが常駐型だった場合、
コレクションからの参照を解放しても『Set obj = Nothing』を
記述し忘れた場合は、参照が残ってしまい、
メモリ上にオブジェクトは残ってしまう
という考え方で、正しいでしょうか?
再度の質問で恐縮ですが、お返事頂ければ、幸いです。
> コレクションオブジェクトにAddした時点で
> コレクションオブジェクトがそのオブジェクトを参照する、
> という考え方で、正しいでしょうか?
正しいと思います。
Collection に Add しようと、他のオブジェクト変数に Set しようと、
オブジェクト参照の保持という点では、動作的にはかわりません。
> また、仮にプログラムが常駐型だった場合、
この場合の『常駐型』というのは、どのような意味でしょうか?
> コレクションからの参照を解放しても『Set obj = Nothing』を
> 記述し忘れた場合は、参照が残ってしまい、
というわけではありません。(まぁ、あながち間違いとも言えないのですが)
Nothing を代入するかどうかというのは、解放処理とは直接関係ありません。
最終的に、そのオブジェクトが「どこからも参照されなくなった時」に、
オブジェクトが解放される、というのが ActiveX オブジェクトの原則です。
ですからたとえば、下記のように Nothing 無しで解放される事もあるわけです。
Option Explicit
Private Sub Alpha()
Dim C As Object
Set C = New Class1
Set C = Nothing '……この行の実行後、Class1 は解放される
End Sub
Private Sub Beta()
Dim C As Object
Set C = New Class1
End Sub '………………この行の実行後、Class1 は解放される
Private Sub Gamma()
Dim C As Object
Set C = New Class1
Set C = Err '……この行の実行後、Class1 は解放される
End Sub
Private Sub Command1_Click()
Alpha
Beta
Gamma
End Sub
お返事が遅くなり申し訳ありません。
そのオブジェクトが「どこからも参照されなくなった時」
がポイントですね。
なんとなく、自分の中で整理がつきました。。
ありがとうございました。
| ツイート |
|