2009-07-30 5 views
2
Dim x as whatever 

Try 

    x = new whatever(1) 

    something is done with x 

    x = new whatever(2) 

    something is done with x 

Catch 

Finally 

    x.dispose 

End Try 

何をx何でも(1)同じ変数を持つvb.netの複数の "= new"。ガベージコレクションはどのように処理されますか?

ガベージコレクションが最初に新しいへのポインタを見つけ、それを破壊するん=または何になりますか?

+0

まだ試したことはありませんが、これをテストするという考えは、オブジェクトが消滅した時点でオブジェクトを1つ破棄したときのものです。私が新しい物体を作って処分すれば、何も消えません。これらの変数はvalで渡されるか、またはsubsで作成されても、消滅することなく処分することはできません。 –

答えて

9

ガベージコレクションでは最終的に古いオブジェクトが見つかり、になります。これは処分とまったく同じではなく、オブジェクトがファイナライザスレッドに置かれるときに追加のGC生成から生き残る必要があります。

変数を別の変数名(どちらにしてもよい)で置き換え、両方を破棄したり、変数を上書きしてから2番目の変数に上書きしたりする必要があります。

using statementを使用すると、オブジェクトが確実に処分され、try/catchをまったく必要としないようにすることができます。

Using x as new whatever(1) 
    something is done with x 
End using 

Using y as new whatever(2) 
    something is done with y 
End using 

[編集:長い話です。あなたは最初のxを逆参照します。その後、GCが実行され、最初のXに根がないことが検出されます。オブジェクトにファイナライザがある場合は、ファイナライザスレッド上のオブジェクトへの参照が格納されます。オブジェクトが使い捨てであるからといって、必ずしもオブジェクト自体にファイナライザがあるわけではありませんが、オブジェクトやサブオブジェクト内のどこかに1つ持っている。つまり、オブジェクトまたはサブオブジェクトがGC実行中に存続するため、第1世代に昇格します。次にファイナライザが実行され、の非管理メモリを解放するファイナライザスレッドのすべてのオブジェクトがファイナライズされます。その後、GCが再び実行されるのを待たなければなりませんが、今度は第1世代のコレクションを待たなければなりませんが、最終的にオブジェクトが収集されます。

0

あなたがDispose(void)に電話する必要がある場合、どのように/いつ/遅くに議論しているのですか?Kim Hamilton sums up nicely。あなたの例でDispose(void)を呼び出すと、オブジェクトの逆参照を行う前にオブジェクトのすべてのインスタンスに対して呼び出す必要があります。

+0

いいリンクの+1。 –

+0

ブログの投稿を私に指摘してくれてありがとう。しかし、上のコードは間違っているので、私はそれをdownvoteするつもりです。これが正しい形式で、これがwinformsアプリで、 'whatever'がフォントか何かであるか、' whatever'がWCFクライアントプロキシでない限り、 'Using'ブロックを使用することです。キム・ハミルトンやジェフリー・リヒターも、フォントが明示的に割り当てられていれば、それは「使用」ブロックで廃棄されるべきだと主張しています。 –

+0

私が気に入っている点は、すべての使い捨てオブジェクトを自動的に処分するべきではないということですが、それぞれのメリットを慎重に検討し、限られた状況では処分を呼ばないように注意してください。個人的には、私はほとんどすべての時間を処分することに大いに傾いています。 –

関連する問題