2010-11-26 4 views
23

これはgcrootのテンプレートを理解するためにこのarticleを読んでいます。私はgcrootの理解

gcrootが ガベージコレクトヒープ

自体がガベージコレクト ではありません

ハンドルことにハンドルを提供して理解しています。私は理解していない何

次のとおりです。

ガベージコレクトヒープとCLRオブジェクトが移動し、ハンドル は オブジェクトの新しいアドレスが返されますとき。変数は、 gcrootテンプレートに割り当てられる前に固定されている必要はありません。

これは、オブジェクトを参照するgcrootハンドルがある場合でも、CLRオブジェクトがガベージコレクタによって削除されることを意味しますか?

「新しいアドレス」とは何ですか?そして、 "変数がgcrootテンプレートに割り当てられる前に固定される必要はありません"という意味は何ですか?

答えて

29

ガベージコレクションは、参照されていないオブジェクトを削除するだけでなく、参照されているオブジェクト、空きメモリプールのデフラグを行います。記事でCLRヒープ内を移動するオブジェクトについて話すとき、おそらく「ガベージコレクションでまだ参照されているオブジェクトが移動すると、gcrootハンドルは自動的に更新され、CLRオブジェクトを指すようになります」

あなたはそうのように、pin_ptrキーワードを使用して周りにオブジェクトを移動するからGCを防ぐことができます。

Object ^obj = gcnew <something>; 
pin_ptr pinned = obj; /* obj won't move due to GC as long as pinned is in scope. */ 
/* do something interop-y here, pass to native code in a DLL, etc. */ 

ピニングの詳細については、this articleを参照してください。

観察:記事に誤字がある可能性があります。ガベージコレクションされたヒープではなく、ガベージコレクションヒープ内にあると言えば、それはあなたの理解を向上させましたか?記事で表現されている方法では、GCクリーニングされた家がいつもあなたの足の下で地球が動くように聞こえます。

+1

はい - その部分は私を混乱させました。あなたの答えの残りの部分は、より鮮明な絵を描いています。 +1 – Seth