JavaScriptでは、新しいActiveXObjectを介して作成されたオブジェクトで終了したら、nullに設定する必要がありますか?

StackOverflow https://stackoverflow.com/questions/5835507

質問

WSH内で実行されてオブジェクトを作成するJavaScriptプログラムでは、Scripting.filesystemObjectまたは任意のcomオブジェクトとしましょう。終了時に変数をnullに設定する必要がありますか?たとえば、これを行うことをお勧めします。

var fso = new ActiveXObject("Scripting.FileSystemObject");
var fileStream = fso.openTextFile(filename);
fso = null;  // recommended?  necessary? 
... use fileStream here ...
fileStream.Close();
fileStream = null;  // recommended? necessary?

効果は、VARを範囲外にするだけではありませんか?

役に立ちましたか?

解決

NULLをオブジェクト変数に割り当てると、メモリ管理システムがリソースを破棄できるように、参照カウンターが減少します。変数が範囲外に出ると、参照カウンターは自動的に減少します。したがって、手動でそれを行うことは、ほとんどすべての場合に時間の無駄です。

理論的には、最初のオブジェクトAを使用する関数は、2番目の部分の別の大きなオブジェクトBを使用し、Aが中央でnullに設定されている場合、メモリ効率が高くなる可能性があります。しかし、これはMMSにAを破壊するように強制しないため、声明はまだ無駄である可能性があります。

派手なクラスデザインを行うと、循環参照が得られる場合があります。その後、手で円を壊すことが必要かもしれませんが、おそらくそもそもそのようなループを避ける方が良いでしょう。

ザッピング変数によって回避できるバグを備えた古代のデータベースアクセスオブジェクトについての噂があります。私はそのようなブードゥー教のプログラミングルールの基礎を築くことはありません。

(インターネット上に「セットx = Nothing」でいっぱいのVBScriptコードがたくさんあります。著者は「習慣」や他の言語(C、C ++)について話す傾向があります)

他のヒント

Ekkehard.hornerが言ったことに基づいて...

VBScript、JScript、ASPなどのスクリプトは、メモリを管理する環境内で実行されます。そのため、オブジェクト参照をnullまたは空に明示的に設定すると、必ずしもメモリからそれを削除するとは限りません...少なくともすぐにはありません。 (実際には、ほとんど瞬時にありますが、実際には、タスクは後の時点で実行される環境内のキューに追加されます。)この点で、それはあなたが思っているよりもはるかに有用ではありません。

コンパイルされたコードでは、プログラム(または場合によってはコードのセクション)が終了する前にメモリをクリーンアップして、割り当てられたメモリがシステムに返されるようにすることが重要です。これにより、あらゆる種類の問題が防止されます。ゆっくりと実行されるコード以外では、これはプログラムが終了するときに最も重要です。 ASPやWSHなどのスクリプト環境では、スクリプトが終了すると、メモリ管理がこのクリーンアップを自動的に処理します。したがって、すべてのオブジェクト参照は、あなたが明示的に自分でそれをしていなくても、あなたのためにnullに設定されています。

スクリプトの実行中のメモリの懸念に関する限り、問題を引き起こすのに十分な大きさの配列または辞書オブジェクトを構築している場合、スクリプトの範囲を超えているか、コードで間違ったアプローチを取得しました。言い換えれば、これはそうすべきです 一度もない VBScriptで発生します。実際、環境は、そもそもこれらの問題を防ぐために、配列と辞書オブジェクトのサイズに制限を課します。

メインプロセス中に不要なトップ/スタートでオブジェクトを使用するスクリプトが長く実行されている場合、これらのオブジェクトをnullに設定すると、メモリが早く解放され、害はありません。他のポスターで述べたように、実際の利点はほとんどないかもしれません。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top