Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lernen Reale Anwendungen von Smart Pointers | Fortgeschrittene Themen
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
Reale Anwendungen von Smart Pointers

Smart-Pointer spielen eine entscheidende Rolle in der modernen C++-Entwicklung. Sie bieten nicht nur dynamisches Speichermanagement, sondern ermöglichen auch eine effiziente und sichere Handhabung verschiedener realer Szenarien. Lassen Sie uns einige fortgeschrittene Anwendungen von std::unique_ptr, std::shared_ptr und std::weak_ptr in praktischen Kontexten erkunden.

Geteilte Pointer

Geteilte Pointer glänzen in allen Bereichen, in denen Ressourcenteilung erforderlich ist. Betrachten Sie ein Szenario, in dem mehrere Komponenten in einem System Zugriff auf eine gemeinsame Ressource benötigen, wie eine Datenbankverbindung. In diesem Fall können wir einen geteilten Pointer verwenden, um das Management und die Bereinigung der Verbindung effizient zu gestalten.

cpp

main

copy
123456789101112131415161718192021222324252627
#include <memory> #include <iostream> class Database { // Database implementation }; class Component { public: //each component holds a shared pointer to the same resource std::shared_ptr<Database> db_ptr; Component(std::shared_ptr<Database> db) : db_ptr(db) {} // Other component functionalities }; int main() { std::shared_ptr<Database> db = std::make_shared<Database>(); // Different components using the same database Component component1(db); Component component2(db); // Simulate different component usage component1.db_ptr.reset(); // Resets usage in component 1 // component2 still holds a reference to the database }

Im obigen Beispiel erstellen wir eine einzelne Datenbankressource, die von verschiedenen Komponenten geteilt wird. Jede Komponente enthält einen geteilten Zeiger, der auf dieselbe Ressource zeigt. Dies ist eine sichere Methode, um die Datenbankressource zu teilen, da sie sicherstellt, dass die Datenbank so lange am Leben bleibt, wie ein geteilter Zeiger darauf zeigt.

Einzigartige Zeiger

Wenn Sie einige Objekte mit einem Container wie einem Vektor verwalten, kann die Implementierung robuster gemacht werden, indem einzigartige Zeiger verwendet werden. Betrachten Sie dieses Beispiel:

cpp

main

copy
12345678910111213141516
#include <memory> #include <vector> #include <iostream> class Widget { public: ~Widget() { std::cout <<"Widget object destroyed." << std::endl; } }; int main() { std::vector<std::unique_ptr<Widget>> widgetContainer; widgetContainer.push_back(std::make_unique<Widget>()); widgetContainer.push_back(std::make_unique<Widget>()); // Proper cleanup upon container destruction widgetContainer.clear(); // Widgets are automatically deallocated }

In unserem obigen Beispiel simulieren wir einen Vektor, der mehrere dynamisch zugewiesene Widgets enthält. Da diese Widgets nicht geteilt werden müssen, benötigen wir hier keinen Shared Pointer. Alles, was wir brauchen, ist ein Unique Pointer, der sicherstellt, dass jedes einzelne Widget ordnungsgemäß freigegeben wird, wenn der Vektor geleert wird.

Wenn Sie das obige Programm ausführen, sehen Sie, dass der Destruktor automatisch für beide Widget-Objekte aufgerufen wird.

Schwache Zeiger

In Graphdatenstrukturen können sich Knoten gegenseitig referenzieren, was potenziell zu zyklischen Referenzen führen kann. Wir können schwache Zeiger verwenden, um diese Zyklen zu durchbrechen und Speicherlecks zu verhindern.

Im obigen Codeausschnitt verwenden wir einen schwachen Zeiger, um eine zyklische Referenz in einem Graphen zu vermeiden. Um auf den Knoten zuzugreifen und eine Operation durchzuführen, konvertieren wir den schwachen Zeiger in einen gemeinsamen Zeiger.

War alles klar?

Wie können wir es verbessern?

Danke für Ihr Feedback!

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