2010-11-26 3 views
23

나는이 article을 읽고 gcroot 템플릿을 이해했습니다. 나는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