Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

C++: Smart Pointer

Einen weak_ptr verwenden

Testen Sie unsere 2015 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Der weak_ptr ist ein Sonderfall des shared_ptr. Diese Untervariante hat die Besonderheit, dass der Referenzzähler des shared_ptr sie nicht berücksichtigt. Was sich gefährlich anhört, ist in bestimmten Fällen ausgesprochen nützlich.
04:40

Transkript

Ein "weak_ptr", schwacher Zeiger, ist ein Spezialfall eines shared_ptr. Er wird im Referenzzähler des shared_ptr nicht gezählt und das ist in solchen Fällen nützlich, wo man einen Zeiger braucht, der die Lebensdauer der Ressource, auf die er zeigt, nicht beeinflusst. Ich habe hier eine Arbeitskopie der Übungsdatei "weak_ptr.cpp" und natürlich habe ich auch die Klasse "strc" in diesem Projekt geöffnet. Ein schwacher Zeiger wird von einem shared_ptr erzeugt, wie wir es hier unten in "main" sehen. Zu den anderen Dingen kommen wir gleich. Zwar sind diese auch wichtig, doch wir sehen uns zuerst an, wie wir den weak_ptr erzeugen. Hier erzeuge ich einen shared_ptr mit Hilfe von "make_shared" und der String lautet "thing". Anschließend lege ich mehrere Kopien von ihm an und somit sollte der Referenzzähler nun 6 sein. Ich werde das Projekt nun erstellen und ausführen. Hier sehen Sie die Ausgabe "make several copies", "Erzeuge mehrere Kopien" und der Referenzzähler ist jetzt 6. Wenn ich ihn mit "display" anzeige, erscheint in Klammern der Wert 6 des Referenzzählers Ich verwende dieselbe Display-Funktion wie im shared_ptr-Beispiel. Diese Display-Funktion hier ist für die Anzeige des weak_ptr ausgelegt und da sie etwas komplizierter ist, sehen wir uns zunächst an, wie wir einen weak_ptr erzeugen. Einen weak_ptr erzeugen wir vom shared_ptr. Hier übergebe ich den Konstruktor. Ich übergebe ihm einen shared_ptr, das Objekt "a" und rufe dann "display" auf dem weak_ptr auf. Hier ist das Display-Objekt und zwar die weak_ptr-Version von Display. Ich rufe hier den "use_count" ab und zeige ihn mit der Kennung "s:" an. Das ist der Verweiszähler des shared_ptr. Dann erhalte ich hier eine Sperre vom shared_ptr oder vielmehr vom weak_ptr und diese Sperre gibt einen shared_ptr zurück, auf den ich dann zugreifen kann. Ich kann also auf den Wert oder das verwaltete Objekt nicht direkt von einem weak_ptr aus zugreifen. Zuerst muss ich eine Sperre darauf anfordern. Wenn ich diese Sperre erhalte, dann zeige ich den Wert von diesem neuen shared_ptr an und diesen Zähler, der der Zähler des weak_ptr ist, und dann den "use_count" vom neuen shared_ptr, von dem ich eben eine Kopie erhalten habe. So werden Sie sehen, dass ich eine Kopie des ursprünglichen shared_ptr bekomme. Somit verwende ich jetzt diesen "use_count", dieser Referenzzähler geht auf 7 hoch, wo er eben noch 6 war, als ich ihn vom weak_ptr erhalten habe, bevor ich die Sperre eingerichtet habe. Und wenn dann alles aus dem Gültigkeitsbereich verschwindet, wird dieser shared_ptr automatisch zerstört; der temporäre shared_ptr, den ich mir hier geschnappt habe. Dadurch geht der Verweiszähler wieder nach unten. Dann komme ich natürlich hier vorbei und setze meine Kopien zurück. Jetzt geht der Referenzzähler zurück auf 1. Und dann inspiziere ich erneut meinen weak_ptr und jetzt hat mein weak_ptr einen Referenzzählerstand von 1 und sein temporärer shared_ptr wird zu 2, weil er natürlich eine Sperre erhält. Und er bekommt diese Kopie des shared_ptr und er verwendet sie. Nachdem ich "a" zerstört habe, ist auch der weak_ptr verschwunden oder vielmehr zerstört worden. Ich weiß, dies alles sieht ein wenig verwirrend aus. Wo also würde ich einen weak_ptr einsetzen? Ein übliches Beispiel ist eine Situation, in der man zirkuläre Referenzen verhindern muss. Zum Beispiel kann ein Manager-Objekt auf die Employee-Objekte, Mitarbeiter, zeigen, die es verwaltet, während die Employee-Objekte zurück auf die Manager verweisen können, denen sie berichten. Diese Objekte halten sich nun gegenseitig am Leben, weil sie aufeinander verweisen. Mit Smart Pointern vom Typ "shared_ptr" könnte der Manager niemals zerstört werden, solange Mitarbeiter existieren. Und die Mitarbeiter können niemals zerstört werden, solange der Manager existiert. Mit anderen Worten kann ich keines dieser Objekte zerstören, ohne zuerst das andere zu zerstören. Somit spricht man hier von einer zirkulären Referenz. Die Lösung besteht darin, mindestens einen dieser Zeiger zu einem weak_ptr zu machen. Jetzt kann der Mitarbeiter zerstört werden, ohne zuerst den Manager zerstören zu müssen und dies durchbricht praktisch die zirkuläre Referenz. Ein weak_ptr ist ein Spezialfall eines shared_ptr, der im Referenzzähler des shared_ptr nicht gezählt wird. Er ist nützlich, wenn man einen Zeiger auf etwas braucht, das existieren kann, aber nicht existieren muss. Häufig wird er verwendet, um zirkuläre Referenzen zu verhindern. Doch es gibt natürlich auch noch andere Einsatzfälle.

C++: Smart Pointer

Lernen Sie die verschiedenen Typen von intelligenten Zeigern kennen, wie sie eingesetzt werden und wie sie funktionieren.

29 min (8 Videos)
Derzeit sind keine Feedbacks vorhanden...
 
Software:
Exklusiv für Abo-Kunden
Erscheinungsdatum:13.12.2016

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!