shared_ptr로 메모리 누출을 피하는 방법은 무엇입니까?
-
11-09-2019 - |
문제
다음 코드를 고려하십시오.
using boost::shared_ptr;
struct B;
struct A{
~A() { std::cout << "~A" << std::endl; }
shared_ptr<B> b;
};
struct B {
~B() { std::cout << "~B" << std::endl; }
shared_ptr<A> a;
};
int main() {
shared_ptr<A> a (new A);
shared_ptr<B> b (new B);
a->b = b;
b->a = a;
return 0;
}
거기 있습니다 출력이 없습니다. desctructor가 없습니다 호출됩니다. 메모리 누출. 나는 항상 스마트 포인터가 메모리 누출을 피하는 데 도움이된다고 믿었습니다.
수업에서 상호 참조가 필요한 경우 어떻게해야합니까?
해결책
이와 같은 원형 참조가 있으면 하나의 개체가 weak_ptr
다른쪽으로, shared_ptr
.
구현은 참조 계산, 사이클을 사용하기 때문에
shared_ptr
인스턴스는 재생되지 않습니다. 예를 들어, ifmain()
보유 ashared_ptr
에게A
, 직접 또는 간접적으로 보유하는 ashared_ptr
돌아가다A
,A
사용 카운트는 2입니다. 원본의 파괴shared_ptr
떠날 것입니다A
사용 카운트로 매달려 1. 사용weak_ptr
"사이클을 중단"하기 위해.
고마워, 글렌, 링크에 감사드립니다.
제휴하지 않습니다 StackOverflow