Am 14. September 2017 haben wir eine überarbeitete Fassung unserer Datenschutzrichtlinie veröffentlicht. Wenn Sie video2brain.com weiterhin nutzen, erklären Sie sich mit diesem überarbeiteten Dokument einverstanden. Bitte lesen Sie es deshalb sorgfältig durch.

C++: Smart Pointer

Einen shared_ptr erzeugen

LinkedIn Learning kostenlos und unverbindlich testen!

Jetzt testen Alle Abonnements anzeigen
Diese Variante eines Smartpointers ähnelt dem unique_ptr. Der Unterschied besteht darin, dass sich beim shared_ptr Kopien erstellen lassen. Das erfordert einen Referenzzähler.
05:31

Transkript

Ein gemeinsamer Zeiger, shared_ptr, funktioniert fast so wie unique_ptr, nur mit dem einen Unterschied, dass sich Kopien von einem gemeinsamen Zeiger erzeugen lassen. Hier habe ich eine Arbeitskopie der Übungsdatei "shared_ptr.cpp". Außerdem habe ich die Klasse "strc" in diesem Projekt geöffnet. Einen shared_ptr erzeugen Sie mit der Template-Funktion "make_shared" genau wie hier. Ich erstelle nun das Projekt und führe es aus, damit sich nachvollziehen lässt, was passiert. Ich erzeuge also den neuen Zeiger mit dem Schlüsselwort "new" und somit ruft "strc" Ihren Konstruktor auf und der konstruiert ein neues Objekt mit "new". Wenn ich ein "display" einschiebe, sehen Sie, was passiert. Ich erstelle das Projekt und starte es erneut. Angezeigt wird das Wort "new". Das ist der String, denn "cstring" in der Klasse "strc" steht. Außerdem ist eine Zahl, 1 zu sehen. Hier wird also der usecount angezeigt, d. h ein Referenzähler im shared_ptr. Wir kommen gleich darauf zurück. Außerdem können Sie, wenn Sie wollen, einen shared_ptr direkt erzeugen, ohne "make_shared" zu verwenden. Die Funktion "make_shared" ist allen Compilern geläufig, die intelligente Zeiger unterstützen. Diese waren bereits Teil des C++11 Standards, auch wenn "make_unique" erst mit C++14 ergänzt wurde. Doch man kann solche Zeiger trotzdem noch direkt erzeugen. Dabei schreiben Sie "std: :shared_ptr" übergeben den Klassennamen des zu verwaltenden Objekts, der in diesem Fall "strc" lautet und erzeugen mit "new", dieses Schlüsselwort ist erforderlich, ein neues "strc"-Objekt mit dem Wert "foo". Und dann kann ich hier "disp(x)" schreiben. Wir erstellen und starten das Projekt. Es wird das Objekt "x" angezeigt, das den String "foo" enthält und wieder erscheint der Referenzzähler: 1, und hier ist auch der Konstrukteur dafür zu sehen, doch es wird empfohlen, die Template-Funktion "make_shared" zu verwenden. Und das ist wirklich die richtige Vorgehensweise, die Sie auch in den meisten Fällen beibehalten werden. Ein shared_ptr unterscheidet sich von einen unique_pointer, vor allem darin, dass ein shared_ptr kopiert werden kann. Die shared_ptr-Klasse zählt die Kopien mit Hilfe des Kopier-Konstruktors und Destruktors der Klasse. Diesen Zähler nennt man oftmals auch Referenzzähler. Jedes mal, wenn Sie eine Kopie erstellen, schaltet der Referenzzähler um eins weiter, und wenn eine Kopie zerstört wird, verringert sich der Zähler um eins. Erreicht der Zähler den Stand 0, wird das verwaltete Objekt zerstört. Auf den Referenzzähler greifen Sie mit dieser usecount-Methode hier, auf dem shared_ptr-Objekt zu. Und nur so als Beispiel, erzeuge ich hier ein Bündel von Kopien von a und zwar so: Ich lege fünf Kopien an und nummeriere sie weiter mit zwei, drei, vier und fünf. Dann rufe ich "disp(a)" auf, anschließend zerstöre ich die Kopien: "x1reset()" Zwei, drei, vier, fünf. Und wir rufen "disp(a)" auf. Wenn ich das Projekt jetzt erstelle und ausführe, sehen Sie, dass ich einen Referenzzähler von 6 erhalte und dann einen Referenzzähler von 1. Nachdem ich all diese Kopien erstellt habe und trotzdem noch "a" anzeige, hat der Referenzzähler den Stand 6. Er kommt also wieder von dieser usecount-Methode im shared_ptr-Objekt. Somit wird das Objekt erst zerstört, wenn der Referenzzähler 0 erreicht. Natürlich kann ich auch eine Kopie anlegen. Hier erzeuge ich eine Kopie mit "b = a". Der Referenzzähler steigt auf 2. Und wie Ausgabe der Vergleiche zeigt, sind sowohl die Objekte, als auch ihre Zeiger gleich. Das hängt damit zusammen, dass sie auf dasselbe Ding zeigen und dass der reine Zeiger genau dieselbe Adresse enthält. Zudem werden die "=="-Operatoren durch die Smartpointer-Klasse überladen. Wenn wir also "a" auf "two" zurücksetzen, verwenden wir die "reset"-Methode auf dem shared_ptr und weisen ihm ein neues Objekt von "two" zu. Jetzt sind "a" und "b" verschieden und Sie sehen, dass ihr Referenzzähler jeweils auf 1 stehen. Dies hat also den Referenzzähler auf "a" dekrementiert, der vorher 2 war, weil wir eine Kopie hatten und nun ist er lediglich 1 und "a" ist nicht mehr gleich "b". Wir können Sie auch mit der swap-Methode vertauschen. Wenn wir sie vertauschen, werden weder Konstruktor noch Destruktor aufgerufen. Wir können auch die standardmäßige swap-Methode verwenden. In diesem Fall stellen wir fest, dass Konstruktoren und Destruktoren aufgerufen werden, wenn wir die Zeiger vertauschen. Wenn wir die Objekte vertauschen, sehen Sie, dass Konstruktoren und Destruktoren nicht mehr aufgerufen werden. Wenn wir dann zum Ende des Gültigkeitsbereichs gelangen, werden die Destruktoren aufgerufen, weil die Smartpointer zerstört werden. Wenn sie zerstört werden, verwalten sie die Objekte ordnungsgemäß und zerstören sie ebenfalls durch Aufruf der Destuktoren. Der shared_ptr ist somit wahrscheinlich der am häufigsten verwendete Smartpointer. Er ist sehr effizient, er ist leicht zu verwenden und er erleichtert es ungemein gemeinsame Speicherressourcen zu verwalten.

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!