필자가 모든 shared_ptr 객체를 사용하고 주기적 종속성이있는 경우 약 포인터가 순환 종속성 문제에 사용됩니다. 약한 포인터는 사이클을 깨는 데 사용됩니다. 약한 포인터는 공유 포인터를 생성하는 lock()을 사용하여 이것을 달성합니다.weak_pointer.lock()은 weak_ptr을 생성하는데 사용 된 원래 shared_ptr의 참조 카운트를 증가시킵니다.
class A { shared_ptr<B> b; ... };
class B { weak_ptr<A> a; ... };
shared_ptr<A> x(new A); // +1
x->b = new B; // +1
x->b->a = x; // No +1 here
하지만 지금은 내가 전화 잠금을 만든 가정의 x> B-> a.lock(), 그래서 X의 심판이 카운트는 2가 될 것이고, x는 범위를 떠나면, 여전히 메모리 누수 바로 거기에있을 것입니다 ? lock()을 사용하여 공유 포인터를 만들었 기 때문에 ref 수는 2가되었습니다. 제 이해가 정확한지 아닌지 알려주세요.
'lock()'에 의해 생성 된 객체가 소멸자에 의해 파괴 될 때, 그 객체는 카운트를 다시 감소시킨다. –
'lock()'의 반환 값으로 무엇을합니까? 이를 + 시하면 즉시 잠금이 다시 제거됩니다. – aschepler
공정한 [간단한 샘플 프로그램] (https://ideone.com/3JQsaX)은 어떤 일이 일어나는지 보여줍니다. 자물쇠()는 사용하는 동안 가치가 거의 없습니다. – WhozCraig