부스트 :: shared_ptr use_count
-
23-08-2019 - |
문제
다음 코드에서 무슨 일이 일어나고 있는지 이해하려고합니다. 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
다시 한번 c
Shared_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
인스턴스는 범위를 벗어납니다.
제휴하지 않습니다 StackOverflow