2016-10-19 2 views
3

Ich bin ein wenig verwirrt über Boos Intrusivzeiger. Die Definition sagt:Boost intrusive Zeiger

„Jede neue intrusive_ptr Instanz den Referenzzähler durch einen uneingeschränkten Aufruf der Funktion erhöht mit intrusive_ptr_add_ref, es den Zeiger als Argument übergeben Ähnlich, wenn ein intrusive_ptr zerstört wird, ruft er. intrusive_ptr_release;. diese Funktion ist verantwortlich für die Zerstörung des Objekts, wenn seine Referenz Zähler auf Null abfällt der Benutzer wird erwartet, geeignete Definitionen dieser beiden Funktionen bereitzustellen "

.

Bedeutet das, dass ich diese Methoden implementieren muss, oder dass ich es kann? Der Punkt ist, dass wir es verwenden, da eine Funktion einen störenden Zeiger benötigt. Wir haben den geteilten Zeiger an den anderen Stellen verwendet, also haben wir uns nur Sorgen gemacht, ob der Zeiger verwaltet wird, und er wird gelöscht, wenn keine Referenzen mehr darauf vorhanden sind.

Antwort

4

Sie müssen diese Funktionen bereitstellen. So funktioniert boost::intrusive_ptr.

Vergleichen wir es mit boost::shared_ptr. shared_ptr verwaltet den Referenzzähler selbst im Steuerblock, der dem Zeiger zugeordnet ist. Durch das Erstellen eines shared_ptr wird der Refcount erhöht. Durch das Zerstören eines shared_ptr wird der Refcount dekrementiert. Wenn der Refcount auf 0 geht, wird der Zeiger zerstört.

intrusive_ptr funktioniert auf die gleiche Weise, verwaltet aber nicht die Referenzzählung selbst. Es signalisiert nur seinem Client "jetzt muss der Refcount inkrementiert werden" und "jetzt muss der Refcount dekrementiert werden." Dies geschieht durch Aufruf der beiden genannten Funktionen intrusive_ptr_add_ref und intrusive_ptr_release. Wenn Sie sie nicht definieren, erhalten Sie einen Kompilierungsfehler.

Stellen Sie sich diese Funktionen als Schnittstelle zum Referenzzähler vor. Die Verwendung von intrusive_ptr zeigt an, dass der Refcount irgendwo außerhalb des Zeigers (normalerweise im Pointer selbst) verwaltet wird, und der Zeiger nur auf diesen Refcount eindringt und ihn für seine Zwecke verwendet.

+0

Vielen Dank für die detaillierte Erklärung. Obwohl wir keine Kompilierungsfehler erhalten, wenn wir ein intrusives_ptr für ein Boost-Statechart-Ereignis erstellen. Bedeutet dies, dass die Implementierung dieser Methoden innerhalb des Boost-Statechart-Ereignisses liegt? –

+0

@BenjaminLarsen Könnte sein, ich weiß nichts über Boost Statecharts. – Angew

+0

Wir haben die Implementierung gefunden, sie wurde innerhalb des Events implementiert. Danke noch einmal! –