オブジェクトクリア/配列の割り当て解除はVB6 / VBAで本当に必要である(賛否/短所?)
-
20-09-2019 - |
質問
私は静的コード分析を使用してから学んだ私はVBについて学んだことの多く(特にAivostoのプロジェクトアナライザ)。そして、それがためにチェックすることの一つ一つは、あなたがすべてのオブジェクトと配列をクリアするかどうかではありません。 PAがそう言ったので、私はただやみくもにこれを行うために使用されます。しかし、今、私はVBのリリースリソース方法について少し詳細を知ること、これらの事を自動的に起こってされるべきであると私には思えます。これは事前にVB6からのレガシー機能です、または明示的に戻って何もオブジェクトを設定し、アレイで消去を使うべき理由があるのでしょうか?
解決
問題は、私はそれを理解し、VB6(およびその前任者)がCOMでそのルーツ、そしてその参照カウントガーベジコレクションシステムを持っているという事実に関係しています。
あなたがサードパーティのライブラリからオブジェクトにreferneceを宣言すること、例えば、想像してみてください。そのオブジェクトは生きている、それを維持するために、それが破壊されるべきかを決定するために両方を使用しているCOMの参照カウントを持っています。それはあなたがNothingにそれを設定したときに破壊され、そのオブジェクトの参照カウントがゼロに達するとされていません。
これで、すべてのCOMコンポーネントは、Visual Basicで書かれていたではありません。いくつかは、CまたはC ++で書かれていました。構造化例外処理は、すべての言語間で存在していませんでした。エラーが発生したのであれば、オブジェクトの参照カウントを適切に軽減することが保証されていなかった、とCOMオブジェクトは長くそれらが意図していたよりも、周りにハングアップすることが知られていました。これは、それ自体のVisual Basic、との問題ではありませんでした。これは、COMの問題でした。 (あなたが注意かもしれないと、という、.NETは、参照カウントを使用していない理由である。)
Visual Basicの開発者は、ルーチンを終了する前に、オブジェクト参照を解放に関する強迫観念になった理由です。あなたは、単にあなたが割り当てているコンポーネントは、ボンネットの下に作成されるかわかりません。あなたはそれにあなたの参照を解放するときしかし、あなたは、少なくともそれをあなたの参照カウントを解放しています。それはほとんど宗教的なマントラとなりました。 、使用、解放を宣言します。それは物事のCOMの方法でした。
確かに、Visual Basicは、私がスタック上に宣言された変数を参照解除で良いか速いかもしれません。しかし、くそ、私はそれらのオブジェクトが解放されたことは明らかになりたいです。少し保証はあなたがメモリリークを追跡しようとしている長い道のりを行く。
他のヒント
マット・Curland、高度のVisual Basic 6 のの著者、私たちのほとんどは、これまで意志よりもVisual Basicの、それは努力を無駄にしていると考えています。 DAO、主にAccessデータベースエンジンを対象とCOMデータアクセスライブラリについては、この引用符(P110)を考えてみます:
乏しいティアダウンコードの他の例を示します。 DAOでなければなりません閉じるメソッドを持っています 正しい順序で呼び出され、 オブジェクトがで解放されなければなりません 正しい順序にも(レコードセット データベースの前に、例えば)。この 単一貧弱なオブジェクトモデルの振る舞いがあります 誤解につながっているVB漏れ あなたが明示的にすべて設定しない限りメモリ で、何もローカル変数 関数の終わり。これは で完全に偽の概念 うまく設計されたオブジェクトモデル。 VB缶 終了時より早く変数をクリア コードからのサブ行することができますよりも、と それも、あなたならば、変数をチェックします 明示的に参照を解放。 あなたが作る任意の努力が複製されます。
あなたが(プロジェクトアナライザーのクリエイターから)この Aivostoウェブページを読むことがありますか?
あなたは静的変数を使用している場合は、 それはメモリを再利用することが重要です 必要のないときには、占有しました 変数のいずれかのより多くの。ダイナミック付き 変数のメモリはそれほどではありません 問題は、それらが破壊されているので、 手続きが終了したときます。
言い換えれば、あなたは通常、非静的ローカル変数をクリアすることを心配する必要はありません。
私は常に良い練習のためにそれを行う、あなたは1に該当し、あなたのオブジェクトが割り当て解除されていない場合は、例外が行う可能性があります知っていることはありません。あなたは最終的には文でそれらをrelase、彼らはそうしないと、メモリリークに遭遇する可能性のあるメモリを使用していないことを確認する必要があります。
私は、サーバーがランダムにクラッシュに保たれ、簡単なオフタイムトラッカーシステムの内部の問題を持っていた、それは自分自身で自己破壊になっていたオブジェクトのメモリリークしたかを決定するために数週間かかりました。私のコードは、例外に投げ、決してサーバー(実際のウェブサイト全体ではなくサーバ)がダウンする原因そのもの後にクリーンアップされていました。
はい、Nothingにすべてのオブジェクトを設定し、できるだけ多くをクリーンアップします。 VB6は、自分のものをクリーンアップしていないときにメモリリークを持つことで有名です。ガベージコレクションは、VB6 / VBAにサブパーだっます。