2011-12-19 1 views
4

현재 참조 카운팅 기술을 사용하여 (C++의) 가비지 수집기를 구현하고 있습니다. 그러나 중요한 문제는 순환 참조 된 데이터는 참조 횟수가 항상 0이 아니기 때문에 수집되지 않는다는 것입니다.C++ 가비지 수집 및 순환 참조 데이터

나는 가비지 컬렉터, 마크 앤 스위프 알고리즘 등을 추적하는 것을 발견했다. 그 중 하나를 구현할 수 있습니까? 정확히 어떻게 작동합니까?

+2

약한 참조를 살펴보십시오. 또한 순환 참조를 모두 피하십시오. –

+0

이것은 아주 잘 형성된 질문이 아닙니다. 물론 하나를 구현할 수 있으며 좋은 프로그래밍 언어 책을 살펴보고 가비지 수집 알고리즘의 작동 방식을 이해해야합니다. –

+0

CPP와 동의 : 그것에 대해 생각한다면 진정한 대칭 순환 참조가 될 수 없습니다. 누군가 항상 먼저 와야합니다. 따라서 "원형"의 마지막 가장자리는 "약한 참조"여야하며 문제가 해결됩니다. –

답변

1

http://www.boost.org/doc/libs/1_48_0/libs/smart_ptr/weak_ptr.htm

이미 shared_ptr에 의해 관리되는 것 객체 에 약한 참조 "는"weak_ptr를 클래스 템플릿이 저장 '. 개체에 액세스하려면 weak_ptr를이있는 shared_ptr을 사용하여 shared_ptr을 변환 할 수 있습니다 생성자 또는 구성원 함수 lock 마지막 shared_ptr을 으로 이동하면 개체가 사라지고 개체가 삭제되면 개체를 참조하는 weak_ptr 인스턴스에서 shared_ptr을 가져 오는 시도가 실패합니다. 생성자는 유형이인 예외boost :: bad_weak_ptr 및 weak_ptr :: lock은 빈 shared_ptr을 반환합니다. " 방향 중 하나에 약한 포인터를 배치하려고

당신은 정말 순환 참조를하지 말았어야하지만, 당신이 디자인 작업을하는 경우 당신은 (때때로 일어날 않는) 그들을 밖으로 리팩토링 할 수없는 곳들이 너무 파괴를 막지 마십시오.

+0

가비지 컬렉터없이 리소스를 관리하고 있지만 OP가 가비지 수집기를 구현하는 데 도움이되지 않는다면 좋은 조언입니다. –

+0

+1 -이 답변은 문자 그대로의 질문 뒤에있는 문제를 해결하는 쉬운 방법으로 유용합니다. –

+0

예, 현재 GC로 인한 문제를 해결하려고합니다. 사용자가 순환 링크 된 목록과 같은 것을 제어하기 위해이를 사용하면 실패합니다. – IcySnow

3

가비지 수집기 디자인의 고전적인 문제입니다. Garbage Collection article on Wikipedia을 살펴보면 가비지 수집기 디자인에서 다른 장단점을 제시하는 데 정말 좋습니다. 트라이 컬러 마킹과 같은 "진화 된"알고리즘은 실제로 매우 간단하고 구현하기 쉽습니다. 그 지시 사항을 사용하여 C에서 내 자신의 Lisp 구현을 위해 추적 수집기를 구현했습니다.

가비지 수집기 추적에서 처리해야 할 가장 복잡한 것은 객체 트리를 걷는 것입니다 (예 : "라이브"객체에 대한 참조 찾기). 다른 언어에 대한 통역사를 작성하는 경우 루트 객체 클래스 (또는 모든 객체의 다른 공통 분모)에서이를 위해 시설을 연결할 수 있으므로 너무 어렵지 않습니다. 그러나 C++에서 가비지 컬렉터를 C++로 작성하는 경우 다른 할당 된 메모리 영역에 대한 포인터를 찾기 위해 객체 내용을 조사해야하므로이 작업을 수행하는 데 어려움을 겪을 수 있습니다.

교육 목적으로 가비지 컬렉터를 작성하는 경우 다른 언어 (포인터에 직접 액세스 할 수없는 언어)로 통역사를 작성하는 것이 좋습니다. 프로덕션 소프트웨어에서 C++ 용 콜렉터를 C++로 작성하려는 경우 an existing production-quality implementation을 대신 사용하는 것이 좋습니다.