문제

다음 코드를 고려하십시오.

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 소개:

구현은 참조 계산, 사이클을 사용하기 때문에 shared_ptr 인스턴스는 재생되지 않습니다. 예를 들어, if main() 보유 a shared_ptr 에게 A, 직접 또는 간접적으로 보유하는 a shared_ptr 돌아가다 A, A사용 카운트는 2입니다. 원본의 파괴 shared_ptr 떠날 것입니다 A 사용 카운트로 매달려 1. 사용 weak_ptr "사이클을 중단"하기 위해.

고마워, 글렌, 링크에 감사드립니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top