Direkt zum Hauptinhalt springen
eLearner.app
Modul 7 · Lektion 1 von 215/18 im Kurs~12 min
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).

Code
#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.

Code
#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

Übung#cpp.m7.l1.e1
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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

Übung#cpp.m7.l1.e2
Versuche: 0Wird geladen…

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.

Editor wird geladen…
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