- ベストアンサー
closeとメモリの開放について
Sub test() Set cn = New ADODB.Connection cn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & ファイル名 Set rs = New ADODB.Recordset rs.Open "テーブル1", cn, adOpenKeyset, adLockOptimistic Set rs = Nothing Set cn = Nothing End Sub この場合は rs.close cn.close はなくても問題ないですか? 調べてみると 「メモリの開放」という言葉を目にするのですが これがなんのことだかわかりません。 タスクマネージャーで確認するのでしょうか? よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こちらのサイトがいろいろ参考になるかと思います: (この「#19」に限らず) http://www.tsware.jp/labo/labo_19.htm ※メモリの使用状況は「GlobalMemoryStatus というWindows API関数を使ってメモリの状況を取得」とのこと。 (サンプルコードの直前に記載あり) なお、この記事を最初に読んだ後、自分としてどうするか 迷いましたが、結局「念のため、常にCloseとNothingは実行」 することにしました。 (Objectの種類によってはCloseではなくQuitを使用) 実際、上記サイトでテストされているのはプロシージャ内で 宣言した変数に対しての処理ですが、モジュールレベルなど、 もっと上位で宣言した変数に対してだと、確実に解放される のか、やや疑問もありましたので・・・ (AccessからExcelを非表示で操作した際、Book(ファイル)を Closeする前にExcel(アプリケーション)側をQuitしたら、 タスクマネージャ上にExcelが残存、ということも: 正確な操作内容を忘れてしまったので、もしかしたら単に Quitがうまくいっていなかっただけかもしれませんが(汗))
その他の回答 (1)
- Gab_km
- ベストアンサー率40% (20/50)
VB6.0以前のコードでしょうか。 .NETの話しか分からないので参考程度にしかなりませんが、この話はメモリの解放だけで片を付けるものではありません。 cnという変数はDBコネクションを管理しているはずで、コネクションプールからリソースを“借りている”状態です。 もしこれが常駐するプログラムであった場合、借りたものを返さずに運転を続けていたら、そのうちリソースが枯渇するおそれがあります。 (.NET Framework管理であれば、プログラムを落とせばリソースは解放されるという話を聞いた気もします・・・) もちろん、コネクションに限らず、メモリを割り当て、それを解放する責任がある場合も同様です。 使ったら後始末をきちんとするのが良いでしょう。 ということで、私はCloseすることをお勧めします。 なお話が変わりますが、食いつぶされるメモリの使用量ですは、タスクマネージャでは正確な値が分からなかったはずです。 タスクマネージャの値でアプリケーションが所有するメモリの全てが表示されているように見えますが、実際は一部のメモリ管理をランタイムに任せている場合もあります。 このあたりは、詳しい方に解説をお願いしたいですが。。。
お礼
説明不足ですいません。 vbaです。 Closeするようにします。 ご回答ありがとうございます。
お礼
おお!よく読んでみます!ありがとうございます。