Kursinhalt
C++ Smart Pointers
C++ Smart Pointers
Verständnis von Schwachen Pointern
Weak-Pointer sind eine Art von Smart-Pointer, die zu C++ hinzugefügt wurden, um Probleme wie zirkuläre Referenzen zu adressieren, die bei der Arbeit mit Shared-Pointern auftreten können. Genau wie Unique- und Shared-Pointer sind sie Teil der <memory>
Header-Datei und im std
Namensraum definiert.
Hinweis
Der Smart-Pointer
std::weak_ptr
besitzt das Objekt, auf das er zeigt, nicht. Das bedeutet im Wesentlichen, dass ein Weak-Pointer die Referenzanzahl des Objekts nicht erhöht.
Der Hauptzweck von Weak-Pointern ist es, eine Möglichkeit zu bieten, auf ein Objekt zuzugreifen, das möglicherweise von mehreren Shared-Pointern besessen wird, ohne die Lebensdauer dieses Objekts zu verlängern.
Beispiel
Stellen Sie sich vor, wir haben ein Objekt, auf das vier Shared-Pointer zeigen. Wenn wir dann einen Weak-Pointer hinzufügen, der auf dasselbe Objekt zeigt, wird dies die Existenz des Objekts nicht beeinflussen. Das liegt daran, dass Weak-Pointer keinen Einfluss darauf haben, ob das Objekt erhalten bleibt oder nicht. Wenn also alle Shared-Pointer außer Reichweite geraten oder zurückgesetzt werden, wird das Objekt gelöscht, auch wenn der Weak-Pointer noch vorhanden ist.
Dieses Verhalten von Weak-Pointern kann besonders nützlich sein, wenn Sie ein dynamisches Shared-Objekt überwachen möchten, aber dessen Existenz nicht künstlich verlängern wollen. Angenommen, es gibt einen gemeinsamen Ressourcen-Zähler, auf den Sie von einer Beobachterklasse aus zugreifen möchten. Durch die Verwendung eines Weak-Pointers kann der Beobachter auf den Zähler zugreifen, um seinen Wert zu lesen, ohne zu beeinflussen, wann der Zähler freigegeben wird. Der Zähler lebt und stirbt nach den Regeln seiner Shared-Pointer, nicht der Weak-Pointer, die ihn beobachten.
Der Lebenszyklus eines Weak-Pointers
Weak-Pointer sind Beobachter. Sie können das Objekt beobachten und darauf zugreifen, aber ihre Beobachtung beeinflusst nicht die Lebensdauer des Objekts.
Der Lebenszyklus eines Weak-Pointers ist an den Lebenszyklus des Objekts gebunden, das von Shared-Pointern verwaltet wird. Wenn der letzte Shared-Pointer zum zugehörigen Objekt zerstört wird, wird das Objekt freigegeben. Der Weak-Pointer verhindert diese Freigabe nicht. Nach der Zerstörung tritt der Weak-Pointer in einen Zustand der Leere ein; er existiert noch, wird aber nun als abgelaufen betrachtet.
Analogie aus der realen Welt
Stellen Sie sich einen schwachen Zeiger wie ein Ticket für eine Veranstaltung vor. Solange die Veranstaltung läuft (das Objekt lebt), können Sie das Ticket nutzen, um einzutreten (auf das Objekt zuzugreifen). Das Ticket selbst hält die Veranstaltung jedoch nicht am Laufen (verlängert die Lebensdauer des Objekts nicht). Wenn die Veranstaltung endet (das Objekt zerstört wird), wird Ihr Ticket wertlos (der schwache Zeiger wird ungültig).
Danke für Ihr Feedback!