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

C++: Smart Pointer

Einen benutzerdefinierten Deleter verwenden

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Ab und zu genügt es nicht, verwaltete Objekte mit den "eingebauten" Destruktor-Methoden zu zerstören. Falls Sie für Ihre Smartpointer eigene Deleter konstruieren müssen, verrät dieses Video, woran Sie dabei denken sollten.
03:33

Transkript

Wenn man einen Smartpointer zerstört, muss man manchmal mehr mit ihm anstellen, als lediglich das verwaltete Objekt zu zerstören. Für solche Fälle kann man einen benutzerdefinierten Deleter definieren. Hier habe ich eine Arbeitskopie der Übungsdatei custom_deleter.cpp, und außerdem habe ich die Klasse "strc" in diesem Projekt geöffnet. Wenn ich den Smartpointer erzeuge, gebe ich die Adresse einer Deleter-Funktion an, das heißt, einen Zeiger auf die Funktion. Die Deleter-Funktion ist hier zu sehen. Die Deleter-Funktion gibt den Wert vom Objekt aus, dabei bekommt sie den blanken Zeiger auf das Objekt übergeben, nicht die Smartpointer. Sie bekommt den blanken Zeiger, oder das Objekt übergeben. Sie zeigt einen Wert an, und verwendet dann den "delete"-Operator, um die Ressource freizugeben. Der Benutzer definiert den Deleter, ist also dafür zuständig, die Ressource freizugeben, und natürlich kann er tun, was immer er tun muss, wofür man einen benutzerdefinierten Deleter gebraucht hat. Offenbar allein schon, um "delete" aufzurufen. Normalerweise werden Sie ohne eigenen Deleter auskommen, doch dies ist lediglich ein Beispiel. Sie spezifizieren also den Deleter im Konstruktor des Smartpointers, und deswegen können Sie nicht auf die Komfortfunktion "make_shared" zurückgreifen, wenn Sie einen benutzerdefinierten Deleter spezifizieren müssen. Der Deleter kann ein Funktionszeiger wie dieser sein, er könnte eine "lambda closure" sein, oder er könnte eine Klasse als Funktor verkörpern. Und als Beispiel erzeuge ich hier eine Klasse, kopiere all dies nach oben, und lege eine Klasse an. Ich nenne sie einfach D für Deleter. In dem öffentlichen Abschnitt erzeuge ich einen Funktor, der die Funktion namens Operator darstellt, und wie folgt aussieht: Hier füge ich den Code der ursprünglichen Deleter-Funktion ein, und entferne die überflüssigen Zeilen. Jetzt habe ich meinen benutzerdefnierten Deleter als Funktor, und ich kann hier unten statt diesem Code einfach ein großes D einfügen, und das wird den Deleter aufrufen. Außerdem brauche ich wohl diese Klammern, um den Funktor vom Deleter aufzurufen. Ich erstelle und starte nun das Projekt, und ich erhalte das gleiche Ergebnis. Hier ist der Deleter, er zeigt den Wert an, und er ruft den Destruktor auf. Die Funktionsversion hatte ich gar nicht erstellt und ausgeführt. Ich hole das jetzt nach. Hier schreibe ich wieder "&deleter" für die Adresse der Deleter-Funktion. Ich erstelle und starte das Projekt, und ich erhalte genau das gleiche Ergebnis. Anstatt eine separate Funktion oder einen separaten Funktor zu verwenden, können Sie schließlich, wenn Sie mögen, eine "lambda closure" verwenden, wobei sich es sich prinzipiell um einen Inline-Funktionszeiger handelt, der wie folgt aussieht. Und dann bringen Sie den Code, den Sie brauchen, hier unter. Ich sage einfach Lösche O, und wenn ich jetzt das Projekt erstelle, und ausführe, erhalte ich das gleiche Ergebnis. Es ruft den Destruktor auf, und wenn ich versuche, ihn nach dem Reset erneut auszugeben, erhalte ich 0. Für die meisten Zwecke funktioniert also der Standarddeleter, der einfach eine Destruktormethode auf dem verwalteten Objekt aufruft, einwandfrei, doch es ist gut zu wissen, wie man seinen eigenen Deleter spezifizieren kann, falls irgendwelche anderen, abhängigen Ressourcen aufzuräumen sind.

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!