Kursinhalt
C++ Smart Pointers
C++ Smart Pointers
Erstellen von Einzigartigen Zeigern
Technisch gesehen gibt es zwei Möglichkeiten, einen einzigartigen Zeiger zu erstellen. Eine dieser Möglichkeiten wird jedoch von C++-Experten stark abgeraten. Zum Zwecke des Lernens werden wir beide Wege erkunden.
Der empfohlene Weg – Verwendung von std::make_unique
Das std::make_unique
, eingeführt in C++14, ist eine Funktion, die eine sichere und effiziente Möglichkeit bietet, einzigartige Zeiger zu erstellen. Es ist eine großartige Alternative zur Verwendung der new/delete
und new[]/delete[]
Operatoren, die C++-Code anfälliger für speicherbezogene Probleme machen können.
makeunique
#include <iostream> #include <memory> #include <vector> int main() { // Here we use std::make_unique to create a unique pointer to a vector of integers. std::unique_ptr<std::vector<int>> uniqueVectorPtr = std::make_unique<std::vector<int>>(); }
Im obigen Code weist std::make_unqiue
die dynamische Ressource zu und gibt einen einzigartigen Zeiger zurück, der sie besitzt. Wenn der einzigartige Zeiger den Gültigkeitsbereich verlässt, wird die Ressource automatisch freigegeben. Darüber hinaus ist es so konzipiert, dass es ausnahmesicher ist, was die Wahrscheinlichkeit von Ressourcenlecks aufgrund von Ausnahmen beseitigt.
Hinweis
Verwenden Sie
std::make_unique
nicht, wenn Sie einen benutzerdefinierten Löscher für Ihren einzigartigen Zeiger angeben. Benutzerdefinierte Löscher sind ein fortgeschrittenes Konzept, das wir später in diesem Kurs behandeln werden.*
Der verpönte Weg – Direkte Initialisierung
Sie können auch einen einzigartigen Zeiger direkt erstellen, indem Sie ihn mit dem Ergebnis des new
-Operators initialisieren. Diese Vorgehensweise wird jedoch aufgrund potenzieller Ressourcenlecks im Falle einer Ausnahme nicht empfohlen.
newUniquePtr
#include <iostream> #include <memory> #include <vector> int main() { // Insecure way to create a unique pointer for a vector of integers. std::unique_ptr<std::vector<int>> uniqueVectorPtr(new std::vector<int>()); }
Der Vektor im obigen Code wird immer noch automatisch zerstört, wenn der einzigartige Zeiger den Gültigkeitsbereich verlässt. Für maximale Ausnahmesicherheit und bessere Codepraktiken sollten Sie jedoch immer std::make_unique
bevorzugen.
Verwaltung benutzerdefinierter Objekte mit einzigartigen Zeigern
Einzigartige Zeiger sind nicht auf primitive Datentypen (wie Ganzzahlen) oder Standardcontainer (wie Vektoren) beschränkt. Sie können auch verwendet werden, um dynamisch zugewiesene benutzerdefinierte Objekte zu verwalten.
customObjUniquePtr
#include <iostream> #include <memory> class CustomObject { public: //defining a constructor of our CustomObject which takes in two values CustomObject(int value1, int value2) : param1(value1), param2(value2) { std::cout << "CustomObject constructed with values: " << param1 << " and " << param2 << std::endl; } void performAction() { std::cout << "CustomObject is performing an action." << std::endl; } //The destructor of our CustomObject, which will be called when the associated unique pointer goes out of scope. ~CustomObject() { std::cout << "CustomObject destroyed with values: " << param1 << " and " << param2 << std::endl; } private: int param1; int param2; }; int main() { // Using std::make_unique to create a unique pointer for a CustomObject, passing required values to the constructor std::unique_ptr<CustomObject> customObjectPtr = std::make_unique<CustomObject>(42, 77); // Invoking a member function customObjectPtr->performAction(); //Destructor of the custom object will be called when the function ends return 0; }
Im obigen Code verwalten wir ein benutzerdefiniertes Objekt mit einem einzigartigen Zeiger. Sobald das Objekt den Gültigkeitsbereich verlässt, ruft der einzigartige Zeiger seinen Destruktor auf, um es freizugeben. Lesen Sie die Codekommentare, um genau zu wissen, was passiert!
Danke für Ihr Feedback!