문제

다음 코드에서 무슨 일이 일어나고 있는지 이해하려고합니다. Object-A가 삭제되면 Shared_ptr 멤버 변수 객체 B가 메모리에 남아 있습니까?

    class B
    {
    public:
       B(int val)
       {
          _val = val;
       }
       int _val;
    };

    class A
    {
    public:
       A()
       {
          _b = new B(121);
       }
       boost::shared_ptr<B> _b;
    };

    class C
    {
    public:
       C()
       {
       }

       void setRef( boost::shared_ptr<B> b)
       {
          _b = b;
       }
       boost::shared_ptr<B> _b;
    };

    int main()
    {
       C c;
       {
          A *a = new A();       
          cout << "a._b.use_count: " << a->_b.use_count() << endl;
          c.setRef(a->_b);
          cout << "a._b.use_count: " << a->_b.use_count() << endl;
                  delete a;
       }
       cout << c._b->_val << endl;
    }
도움이 되었습니까?

해결책

그만큼 A-오브젝트는 빨리 정리됩니다 a 블록 끝에 삭제됩니다. 그러나 포함 된 shared_ptr은 이후에 복사되어 참조 수를 증가시켰다.

그래서 B-Object의 참조 수는 2입니다 c.setRef (참조 A-객체와 C-사물 shared_ptr). 언제 a 블록 끝에서 삭제 한 다음 B-객체가 떨어집니다 1 다시 한번 cShared_ptr이 지금 참조하고 있습니다.

후에 c 메인의 끝에서 파괴됩니다 shared_ptr 의 일부로 파괴 될 것입니다 c의 파괴, 그리고 이제는 참조 수가 0으로 떨어질 때 B 객체는 삭제됩니다 shared_ptr.

따라서, 참조 수 B-물체:

0: before existence of a.
1: from start of lifetime of a until c.setRef
2: from c.setRef until copy of its parameter
3: from copy of c.setRef''s parameter until return of it
2: from return of c.setRef until end of a''s block
1: from end of a''s block until end of main
0: after main returned (object doesn''t exist anymore now)

다른 팁

아니오, A가 삭제되면 A-> _ B (포인터 자체)가 존재하지 않습니다.

그만큼 물체 c._b가 여전히 그것을 가리키기 때문에 a-> _ b는 계속 존재할 것입니다.

대상 shared_ptr 그것에 대한 최종 참조가 삭제 될 때까지 실시간으로 유지됩니다. 이 경우 이것은 다음과 같습니다 C 인스턴스는 범위를 벗어납니다.

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