boost :: shared_ptr use_count
-
23-08-2019 - |
Frage
Ich versuche zu verstehen, was in den folgenden Code vor sich geht. Wenn Objekt-a gelöscht wird, tut es Shared_ptr Membervariable Objekt-b in Erinnerung bleibt, weil objekt c ein shared_ptr hält zu-b-Objekt?
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;
}
Lösung
Das A
-Objekt wird so bald aufgeräumt wie a
am Ende seines Blockes gelöscht. Aber die Shared_ptr es wurde anschließend kopiert enthält, dessen Referenzzähler erhöht wird.
Damit das B
-Objekt einen Referenzzähler von 2 nach c.setRef
(von dem A
-Objekt und durch das C
-Objekt shared_ptr
bezeichnet) hat. Wenn a
am Ende seines Blocks gelöscht wird, dann fällt die Referenzzählung des B
-Objekt wieder 1
da nur c
der shared_ptr ist es jetzt verweist.
Nach c
am Ende der Haupt zerstört wird, wird sein shared_ptr
auch zerstört werden als Teil c
Zerstörung und jetzt als der Referenzzähler auf Null sinkt, das spitze-to B
Objekt wird durch shared_ptr
gelöscht werden.
So werden die Referenz Zählungen des B
-Objekt:
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)
Andere Tipps
Nein, wenn ein gelöscht wird, ein. -> _ b (der Zeiger selbst) wird aufhören zu existieren
Das Objekt , dass a. -> _ b Punkte werden weiterhin bestehen, weil c._b noch darauf verweist
Das Ziel des shared_ptr
bleibt leben, bis der letzte Verweis darauf gestrichen. In diesem Fall wird dies, wenn die C
Instanz den Gültigkeitsbereich verlässt.