VBのメモリリークについて。初歩的ですみません、、


きたきつね  2004-05-27 22:25:58  No: 113548  IP: [192.*.*.*]

最近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++と同じとと考えてよい
のでしょうか?他にメモリリークの起こるケースがあったらどうかご教授く
ださい。

編集 削除
きた  2004-05-27 22:42:07  No: 113549  IP: [192.*.*.*]

使用言語を書くのを忘れました。すみません
使用言語
Visual Basic6.0
Access2000VBA

編集 削除
ゆう  2004-05-28 11:14:06  No: 113550  IP: [192.*.*.*]

1.の場合は変数DBSがスコープ範囲外になるときに自動的にTerminateの処理
が働のでメモリリークとはならないように思います。
少なくとも自分でクラスモジュールを作成した場合、その様な動作をします。

真相はどうなんでしょうか?

編集 削除
魔界の仮面弁士  2004-05-28 12:19:30  No: 113551  IP: [192.*.*.*]

> メモリリークするときはこの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

編集 削除