|
みなさん、こんにちは。
>
>時間を見つけて色々検証している最中ですが、どうしても
>
>Set XX = Nothing
>
>のタイミングで使用メモリが回復する事がないんですよね…。
>
>当方は VB を扱った事もあまりなくこういった分野には全く詳しくないのですが、
私もExcelのメモリー管理がわかっているわけではありません。
いえ、Windowsのそれについてもです・・・。
私の主張は
あくまでも
>オブジェクトとは、データとプログラムをカプセル化したものですよね?
>だとしたら、
>>「Set xx = Nothing で メモリを解放している訳ではない」
>これは、必ずしも正しくはないと思いますよ!!
これなんです。
つまり、オブジェクトの作り方(クラスの中身)によっては
Set aa=Nothing
で発生するイベントに何らかの処理が施されていれば
メモリが解放されることもありえるということです。
私も色々とクラスに変数を入れて試しましたが、
例えば、こんなクラス
'=================================
Public myarray As Variant
'=================================
Sub set_data()
Dim temp() As Variant
For idx = 1 To 10000
ReDim Preserve temp(1 To idx)
temp(idx) = String(1000, "a")
Next
myarray = temp()
Erase temp()
End Sub
'==================================
Private Sub Class_Terminate()
On Error Resume Next
Debug.Print "term message1 " & TypeName(myarray)
End Sub
但し、Application.MemoryUsedに反映されません。
これは、変数のありかとApplication.MemoryUsedで計測されるメモリとで
に何か違いがあるのでしょうかねえ??
わかりません。
でクラスの内容を変えました。
以下の仕様で試してみて下さい。
クラスモジュール(Class1)では、インスタンスの作成で
予め作成されているブック(clssbk.xls)を呼び出す事を考えます。
適当にデータを入れたブックをclssbk.xlsとして保存しておいてください。
クラスモジュール Class1は、
'==================================================
Public readbk As Workbook
'=================================================
Private Sub Class_Initialize()
Set readbk = Workbooks.Open(ThisWorkbook.Path & "\clssbk.xls")
End Sub
'=============================================================
Private Sub Class_Terminate()
On Error Resume Next
readbk.Close False
Set readbk = Nothing
End Sub
標準モジュールに
'===============================================================
Dim cls As Class1
'==============================================================
Sub test()
With Application
Debug.Print "chk1--" & .MemoryUsed & "---" & .MemoryFree & "---" & .MemoryTotal
End With
Set cls = New Class1
DoEvents
With Application
Debug.Print "chk2--" & .MemoryUsed & "---" & .MemoryFree & "---" & .MemoryTotal
End With
Set cls = Nothing
DoEvents
With Application
Debug.Print "chk3--" & .MemoryUsed & "---" & .MemoryFree & "---" & .MemoryTotal
End With
End Sub
として、「clssbk.xls」と同じ場所に保存して下さい。
保存後、プロシジャーtestを実行してみて下さい。
今度は、使用メモリに違いあると思います。
つまり、
Set Cls=Nothing
によるメモリ解放が認められます。
というように
オブジェクトの中身によって、
Set xx = Nothing の影響は未知数である
というのが私の青年の主張でした・・。
|
|