2010-03-03 8 views
10

주기적 참조를 깨기 위해 share_ptr을 사용하는 weak_ptr에 대해 많은 것을 배웠습니다. 어떻게 작동합니까? 어떻게 사용합니까? 어떤 몸이라도 내게 모범이 될 수 있습니까? 나는 여기서 완전히 잃어버린다.weak_ptr이 주기적 참조를 깨뜨릴 수있는 이유는 무엇입니까?

질문이 하나 더 있습니다. 강력한 포인터가 무엇입니까? 약한 포인터가 존재하는 경우에도 리소스 해제 할 수 있도록

+0

"어떻게 작동합니까? _"일반적으로 그렇게되지는 않습니다. 그것은 제정신이 아닙니다. 디자인 수준에서주기를 제거해야합니다. – curiousguy

+1

@curiousguy 귀하의 방법이 작동하지 않는 장면이 몇 가지 있습니다. 즉 순환 참조가 디자인 _ 도입되었을 때입니다. 예를 들어, GC가없는 동적 언어의 인터프리터는 내부 환경에서 이름을 캡쳐하여 원시 재귀를 허용하는 일류 람다 함수를 지원합니다 (로컬로 생성 된 후 첫 번째 값으로 반환 될 때 그 자체 만이 그것은 순환 참조가되어야합니다. 이것은 전통적으로 _downward funarg 문제로 알려져 있습니다. 그리고 고전적인 해결책은 GC를 사용하고 있습니다.) – FrankHB

답변

6

은 또, 참조 횟수에 포함되지 않는다. weak_ptr을 사용할 때 shared_ptr을 획득하여 일시적으로 참조 횟수를 늘립니다. 자원이 이미 해제 된 경우 shared_ptr 획득이 실패합니다.

Q2 : shared_ptr은 강력한 포인터입니다. 그 중 하나가 존재하는 한 리소스를 해제 할 수 없습니다.

8

강력한 포인터는 개체에 대한 강력한 참조를 보유합니다. 즉, 포인터가 존재하는 한 개체가 파괴되지 않습니다.

오브젝트는 모든 포인터를 개별적으로, 그 숫자만큼 "알지 못합니다"- 이것은 강한 참조 횟수입니다.

A는 종류의 객체를 "기억"weak_ptr를하지만 파괴되는 것을 방지하지 않습니다. 약한 포인터를 통해 직접 개체에 액세스 할 수는 없지만 약한 포인터에서 강력한 포인터를 만들 수 있습니다. 객체가 더 이상 존재하지 않으면 결과로 나오는 강력한 포인터는 null입니다.

shared_ptr<int> sp(new int); 
weak_ptr<int> wp(sp); 

shared_ptr<int> stillThere(wp); 
assert(stillThere); // yes, the original object still exists, we can now use it 
stillThere.reset(); // releasing the strong reference 

sp.reset();   // here, the object gets destroyed, 
        // because there's only one weak_ptr left 

shared_ptr<int> notReally(wp); 
assert(!notReally); // the object is destroyed, 
        // you can't get a strong pointer to it anymore 
+0

코드 샘플은 설명을 아주 잘 보완합니다. –

관련 문제