2010-11-26 16 views
23

gcroot şablonunu anlamak için bu article okunuyor. Bengcroot'u anlama

gcroot çöp toplanan yığın

içine kolları sağlar ve bu

kendilerini toplanan çöp değildir kolları anlıyoruz.

CLR nesne çöp toplama yığın ile hareket

, sap nesnenin yeni adresini döndürür:

Ne anlamıyorum şudur. Bir değişken, gcroot şablonuna atanmadan önce tutturulmuş olmak zorunda değildir.

Bu, CLR nesnesinin, bu nesneyi başvuran bir gcroot tanıtıcı olsa bile çöp toplayıcı tarafından silineceği anlamına mı geliyor?

Başvurduğu "yeni adres" nedir? Ve "değişkenin bir gcroot şablonuna atanmadan önce sabitlenmesinin gerekmediği" ne anlama geliyor?

cevap

29

Çöp toplama, yalnızca ilgisiz nesneleri kaldırmaz, aynı zamanda hala başvurulan nesnelerin etrafında hareket eder, örn. boş hafıza havuzunu birleştirmek için. Makale CLR yığınında hareket eden nesneler hakkında konuştuğunda, "çöp toplama hala başvurulan bir nesneyi taşıdığında, gcroot tanıtıcısı otomatik olarak CLR nesnesini gösterecek şekilde güncelleştirilir."

Çok gibi pin_ptr anahtar sözcüğünü kullanarak etrafında nesneleri hareket GC önleyebilir:

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. */ 

sabitleme hakkında daha fazla bilgi için this article bakınız.

Gözlem: Makalede bir yazım hatası olabilir. Eğer "çöp toplanan yığınla" yerine "çöp toplanan yığın içinde" demiş olsaydı, bu anlayışınızı geliştirmiş olur muydu? Makalede anlatılan şekliyle, GC'nin evi temizlediği zaman, dünyanın yeryüzünün ayaklarınızın altından hareket etmesini sağladığını gösterir.

+1

evet - bu kısım beni gerçekten karıştırıyordu. Ve cevabınızın geri kalanı daha net bir resim çizdi. Teşekkürler. +1 – Seth