Lektionen des Moduls (1/2)
std::unique_ptr und std::shared_ptr
Im klassischen C++ ist die manuelle Speicherverwaltung über die Operatoren new und delete eine häufige Quelle für schwerwiegende Fehler wie Speicherlecks (Ressourcen werden nie freigegeben) oder hängende Zeiger (dangling pointers, Zeiger, die auf bereits freigegebenen Speicher zeigen).
Modernes C++ führt intelligente Zeiger (Smart Pointers) ein, die im Header <memory> definiert sind. Sie verwalten den Lebenszyklus des im Heap allokierten Speichers automatisch mithilfe der RAII-Technik (Resource Acquisition Is Initialization), indem sie die Ressource freigeben, sobald der Zeiger den Gültigkeitsbereich (scope) verlässt.
std::unique_ptr
std::unique_ptr drückt das Konzept des exklusiven Besitzes einer Ressource aus. Er kann nicht kopiert, sondern nur verschoben werden (mittels std::move).
#include <memory>
// Creazione consigliata tramite std::make_unique (C++14)
std::unique_ptr<int> p1 = std::make_unique<int>(42);
// Accesso alla risorsa come un normale puntatore
std::cout << *p1 << std::endl;
// std::unique_ptr<int> p2 = p1; // ERRORE DI COMPILAZIONE: copia non ammessa!
std::unique_ptr<int> p2 = std::move(p1); // Consentito: p1 cede la proprietà a p2
std::shared_ptr
std::shared_ptr implementiert das Konzept des gemeinsamen Besitzes (shared ownership). Mehrere Zeiger können auf dieselbe Ressource zeigen. Die Klasse verwaltet intern einen Referenzzähler (reference count): Der Speicher wird erst freigegeben, wenn der letzte aktive shared_ptr zerstört oder freigegeben wird.
#include <memory>
std::shared_ptr<int> s1 = std::make_shared<int>(100);
std::shared_ptr<int> s2 = s1; // Consentito: incremento del reference count
std::cout << s1.use_count() << std::endl; // Stampa 2 (s1 e s2 condividono la risorsa)
Probier es aus
Deklariere einen std::unique_ptr<int> namens ptr und initialisiere ihn per std::make_unique mit dem Wert 42. Gib den dereferenzierten Wert von ptr mit std::cout aus.
Hinweis anzeigen
Verwende `std::unique_ptr<int> ptr = std::make_unique<int>(42);` und sende dann `*ptr` an den Ausgabestream.
Lösung nach 3 Versuchen verfügbar
Instanziiere einen std::shared_ptr<int> namens ptr1 mit dem Wert 100 unter Verwendung von std::make_shared. Erstelle eine Kopie namens ptr2 und gib schließlich den von ptr1.use_count() zurückgegebenen Wert über std::cout aus.
Hinweis anzeigen
Das Kopieren erfolgt durch eine normale Zuweisung `ptr2 = ptr1;`. Wenn du `ptr1.use_count()` ausgibst, solltest du 2 sehen.
Lösung nach 3 Versuchen verfügbar