Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Verständnis von Schwachen Pointern | Schwache Zeiger
C++ Smart Pointers
course content

Kursinhalt

C++ Smart Pointers

C++ Smart Pointers

1. Einführung in Smart Pointer
2. Einzigartige Zeiger
3. Gemeinsame Zeiger
4. Schwache Zeiger
5. Referenzen
6. Fortgeschrittene Themen

book
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).

Angenommen, es gibt 10 gemeinsame Zeiger und 1 schwachen Zeiger, die auf eine dynamische Ressource zeigen. Nach einiger Zeit geraten alle 10 gemeinsamen Zeiger außer Geltung, und es bleibt nur der 1 schwache Zeiger übrig. Wird der Destruktor der dynamischen Ressource zu diesem Zeitpunkt aufgerufen?

Angenommen, es gibt 10 gemeinsame Zeiger und 1 schwachen Zeiger, die auf eine dynamische Ressource zeigen. Nach einiger Zeit geraten alle 10 gemeinsamen Zeiger außer Geltung, und es bleibt nur der 1 schwache Zeiger übrig. Wird der Destruktor der dynamischen Ressource zu diesem Zeitpunkt aufgerufen?

Wählen Sie die richtige Antwort aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

Abschnitt 4. Kapitel 1
We're sorry to hear that something went wrong. What happened?
some-alt