1. ホーム
  2. vba

オブジェクトをNothingに設定する必要はありますか?

2023-10-22 09:19:49

質問

私はいつも、オブジェクトを使い終わったら何もない状態にすることが推奨されると読んでいます。しかし、私は通常、フォーム内の関数のみでそれらを使用します。

オブジェクトをNothingに設定しても、関数スコープを離れると参照は失われ、メモリは解放されないのでしょうか?

すなわち、本当にそうする必要があるのでしょうか。

Set db = Nothing
Set record_set = Nothing

どのように解決するのですか?

VB では、いわゆる "参照カウント" ガベージコレクタを使用しています。

基本的には、変数がスコープ外に出た瞬間に、参照されているオブジェクトの参照カウンタがデクリメントされます。オブジェクトの参照を別の変数に代入すると、参照カウンタがインクリメントされます。

カウンタがゼロになると、そのオブジェクトはガベージコレクションの準備が完了します。オブジェクトのリソースは、これが起こるとすぐに解放されます。関数のローカル変数は、ほとんどの場合、参照カウントが1より高くなることのないオブジェクトを参照しますので、関数の終了時にオブジェクトのリソースは解放されます。

変数を Nothing に設定することは、明示的に参照カウンターを減少させる方法です。

例えば、あるファイルを読み込んで、ファイルオブジェクト変数を Nothing の直後に ReadAll() の呼び出しの直後です。ファイルハンドルはすぐに解放されますので、その内容をじっくりと処理することができます。

に設定しない場合は Nothing に設定しない場合、ファイルハンドルは必要以上に長く開かれる可能性があります。

貴重なリソースのブロックを解除しなければならないような状況でなければ、単に変数をスコープの外に出してもかまいません。