Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Erstellen von Einzigartigen Zeigern | Einzigartige 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
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.

cpp

makeunique

copy
123456789
#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.

cpp

newUniquePtr

copy
123456789
#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.

cpp

customObjUniquePtr

copy
12345678910111213141516171819202122232425262728293031323334
#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!

Befolgt dieser Code die besten Praktiken, die wir besprochen haben?

Befolgt dieser Code die besten Praktiken, die wir besprochen haben?

Wählen Sie die richtige Antwort aus

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

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