7

.vbs 内のオブジェクトはどのような順序で破棄されますか?

つまり、次のグローバルが与えられます。

Set x = New Xxx
Set y = New Yyy

次のいずれかに対する回答に興味があります。

  1. .VBS に実装されているクラスのインスタンスは、どのような順序Class_Terminateで呼び出されますか? 大雑把な突っ込みは、作成の順序 (逆順ではありません!) を示唆していますが、これは保証されていますか?

    編集Class_Terminate:オブジェクトへの最後の最後の参照が解放されたときに呼び出されることを理解しています。つまり、x と y はどのような順序でリリースされ、それは保証されるのでしょうか? 簡単にするために、x と y がそれぞれのオブジェクトへの唯一の参照であると仮定します

  2. オブジェクトのタイプは重要ですか? たとえば、.VBS にクラスを実装し、Scripting.FileSystemObject.

    編集: COM ライブラリは、スクリプト ホスト エンジンが何も知らない独自の内部循環参照を設定する可能性があることを理解しています。最初の質問への回答に何が影響するかを調べることに興味があります。

  3. x と y がグローバルではなく Sub または Function に対してローカルである場合、上記の答えは異なりますか?

  4. 出口が通常か、例外によるか、または経由かによって異なりますWScript.Quitか? (後者の場合、Class_Terminateは終了する前にまだ未処理のオブジェクトに対して呼び出されているように見えますが、エラーが報告される可能性があります)。

  5. WScript オブジェクトはいつ破棄されますか?

  6. スクリプトのホストは重要ですか? (wscript.exe 対 cscript.exe 対 Web ホスト エンジンの名前)

  7. JScript のオブジェクト破棄モデルは VBScript のものとは異なりますか?

これらの質問のいくつかに対する答えは経験的に見つけることができますが、それらのいずれかが保証/文書化されているかどうかに興味があります.

回答の一部しか知らない場合でも投稿してください。またはさらに関連する問題があります。

4

1 に答える 1

11

この機能をVBScriptで設計および実装しました。

答えのほとんどは、マークが参照している私の記事にありますが、明確にするためです。

Class_Terminateはどのような順序で呼び出されますか?

ターミネータは通常、オブジェクトへの最後の参照が解放されるとすぐに呼び出されます。ただし、循環参照やその他の問題があるため、一般に、決定論的な終了順序に依存することは非常に悪い考えです。

大雑把な突っ込みは、作成の順序(逆の順序ではありません!)で提案しますが、これは保証されていますか?

私の記事で述べたように、エンジンがシャットダウンされると、終了していないオブジェクトは終了します。実装の詳細として、終了キューはオブジェクトが作成された順序で実行されます。ただし、これは文書化されていない実装の詳細であり、信頼するべきではありません。

オブジェクトの種類は重要ですか?たとえば、.VBSに実装されたクラスが、Scripting.FileSystemObjectなどの他のCOMオブジェクトと混在している場合です。

できる。予測できないときに破棄されるオブジェクトの中に循環参照が存在する可能性があります。

プログラムが終了したときに、グローバルスコープのオブジェクトについて考えています。たとえば、関数スコープのオブジェクトでは違いますか?

質問がわかりません。明確にできますか?

出口が正常か、例外か、WScript.Quit経由かによって異なりますか?(後者の場合、終了する前に未処理のオブジェクトに対してClass_Terminateが呼び出されているように見えますが、エラーが報告される可能性があります)。

はい、それは重要です。VBScriptは、ターミネータが常に実行されることを保証するものではありません。エンジンを所有するホストは、たとえば、エンジンを完全にシャットダウンすることが保証されていない方法で「高速に失敗」することにより、プロセスをシャットダウンできます。(壊滅的な障害が発生した場合、これが望ましい場合があります。何が問題なのかわからない場合は、終了コードを実行すると問題が悪化し、改善されないことがあります。)

Windows Script Hostは、Quitが呼び出されたときに、エンジンを正常にシャットダウンしようとします。

WScriptオブジェクトはいつ破棄されますか?

WindowsScriptHostプロセスの終了ロジックが実行されたとき。

スクリプトホストは重要ですか?(wscript.exe vs cscript.exe vs. Webホストエンジンと呼ばれるもの)

はい、それは重要です。

JScriptのオブジェクト破壊モデルはVBScriptのモデルとは異なりますか?

はい、とてもそうです。

私が取り組んだ時代(2001年以前)のJScript "Classic"は、非決定論的なマークアンドスイープガベージコレクターを使用します。これは、スクリプトオブジェクト間の循環参照を処理しますが、スクリプトオブジェクトとブラウザーオブジェクト間の循環参照は処理しません。JScript "Classic"の最近のバージョンには、スクリプトとブラウザオブジェクト間の循環参照を処理するガベージコレクタが変更されています(ただし、JScriptオブジェクトとサードパーティのActiveXオブジェクトに関連する循環を必ずしも検出するわけではありません)。

IE 9バージョンのJScriptには、まったく異なるテクノロジを使用する完全に書き直されたガベージコレクタがあります。私はそのデザイナーと少しおしゃべりをしましたが、その特徴をどのような深さでも議論するのに十分な技術的知識がありません。

もちろん、JScript.NETはCLRガベージコレクターを使用します。

なぜあなたがこれらすべてのものを気にするのか尋ねてもいいですか?

また、私はこのコードを10年以上見ていないことに注意してください。これらすべてを適切なレベルの懐疑論で受け止めてください。私の記憶は間違っているかもしれません。

于 2010-09-17T18:41:46.630 に答える