最近VBの基礎(文法)も身についてきて、VBをきっちり覚えようと勉強しています。
そこで目に留まったのがメモリリークについてでした。C++についてのメモ
リリークの記事はインターネット上ですぐ見つかるのですがVBについては、
納得できるような記事が見つかりませんでした。
自分なりの調べた結果はこうです。
1.オブジェクト型変数を作成してインスタンスを作成、代入して使用後にイ
ンスタンスを開放しなかったとき。
Dim DBS As DAO.Database
set DBS = CurrentDB
・・・・・・・・・・・・・・・・・・・・・・・・・・・
・このまま“Set DBS = Nothing”を実行せずに処理を終了・
・・・・・・・・・・・・・・・・・・・・・・・・・・・
2.一度作成、代入したオブジェクト変数に前のインスタンスを開放せずに新
しいインスタンスを代入したとき。
Dim DBS As DAO.Database
Dim RST As DAO.Recordset
Dim stSQL As String
Set DBS = CurrentDB
stSQL = "SELECT * FROM テーブル1"
Set RST = DBS.OpenRecordset(stSQL) '最初のレコードセットを代入
stSQL = "SELECT * FROM テーブル2"
Set RST = DBS.OpenRecordset(stSQL) '開放せずに次のレコードセットを代入
'↑最初のレコードセットはメモリリーク?
メモリリークするときはこの2つのケースでよいのでしょうか?VBのオブジェクト型変数も参照型であってメモリリークの原理はC++と同じとと考えてよい
のでしょうか?他にメモリリークの起こるケースがあったらどうかご教授く
ださい。
使用言語を書くのを忘れました。すみません
使用言語
Visual Basic6.0
Access2000VBA
1.の場合は変数DBSがスコープ範囲外になるときに自動的にTerminateの処理
が働のでメモリリークとはならないように思います。
少なくとも自分でクラスモジュールを作成した場合、その様な動作をします。
真相はどうなんでしょうか?
> メモリリークするときはこの2つのケースでよいのでしょうか?
それらのケースだけでは、リークしないでしょう。
リークするのは、『循環参照』が行われた場合や、
外部からグローバルオブジェクトを操作した場合などです。
循環参照の問題に関しては、MSDNライブラリの解説を参照してください。
グローバルオブジェクトの件は、下記のような話です。
http://www.interq.or.jp/www-user/komurak/progtec/030.htm#1
ちなみにDAOの場合、RecordsetをCloseせずに最後の参照をNothingすると、
メモリリソースの消費やmdbの肥大化を招くという話もあったります。
http://support.microsoft.com/?kbid=289562