unique_ptr ·
shared_ptr ·
weak_ptr ·
make_unique ·
make_shared ·
move / reset / get
Smart Pointer sind ein zentrales Feature des modernen C++ (C++11 und später). Sie automatisieren die Speicherverwaltung, verhindern Speicherlecks und machen den Code sicherer und lesbarer.
unique_ptr ist ein Smart Pointer mit exklusivem Besitz. Es kann nicht kopiert werden (nur verschoben) und gibt den Speicher automatisch frei, wenn es den Gültigkeitsbereich verlässt.
| Operation | Beschreibung |
|---|---|
| make_unique<T>(args) | Erstellt einen unique_ptr (C++14) |
| ptr.get() | Gibt den rohen Zeiger zurück (ohne Besitz) |
| ptr.reset(p) | Setzt den Zeiger neu (löscht alten Speicher) |
| ptr.release() | Gibt den Besitz auf (Rückgabe des rohen Zeigers) |
| std::move(ptr) | Besitz übertragen (Move) |
make_unique (C++14) für die Erstellung von unique_ptr. Es ist sicherer und effizienter als new.
shared_ptr verwendet Referenzzählung – mehrere Pointer können auf dasselbe Objekt zeigen. Der Speicher wird freigegeben, wenn der letzte shared_ptr zerstört wird.
| Operation | Beschreibung |
|---|---|
| make_shared<T>(args) | Erstellt einen shared_ptr (effizienter) |
| ptr.use_count() | Gibt die Anzahl der shared_ptr zurück |
| ptr.unique() | Prüft, ob der Besitz exklusiv ist |
| ptr.get() | Gibt den rohen Zeiger zurück |
| ptr.reset(p) | Setzt den Zeiger neu (Referenzzähler sinkt) |
make_shared ist effizienter als shared_ptr<T>(new T(...)), weil Speicher für Objekt und Referenzzähler in einer Allokation reserviert wird.
weak_ptr ist eine schwache Referenz auf ein Objekt, das von einem shared_ptr verwaltet wird. Es verhindert zyklische Referenzen (Speicherlecks) und wird oft in Observer-Patterns verwendet.
| Operation | Beschreibung |
|---|---|
| weak.lock() | Erzeugt einen shared_ptr (falls Objekt noch existiert) |
| weak.expired() | Prüft, ob das Objekt bereits gelöscht wurde |
| weak.use_count() | Gibt die Anzahl der shared_ptr zurück |
| weak.reset() | Setzt den weak_ptr zurück |
weak_ptr immer dann, wenn Sie zyklische Referenzen vermeiden müssen – z.B. in doppelt verketteten Listen, Bäumen oder Observer-Patterns.
make_unique (C++14) und make_shared (C++11) sind die bevorzugten Funktionen zur Erstellung von Smart Pointern. Sie sind sicherer und effizienter als die direkte Verwendung von new.
make_unique und make_shared immer statt new. Sie sind sicherer (keine Memory Leaks) und effizienter (besonders make_shared).
Operationen auf Smart Pointern ermöglichen den Zugriff auf den rohen Zeiger, das Zurücksetzen und das Übertragen von Besitz.
release() gibt den Besitz auf – der Speicher muss manuell freigegeben werden! Verwenden Sie release() nur, wenn Sie den Besitz an eine andere Komponente übergeben müssen.
Best Practices für die Verwendung von Smart Pointern – Tipps für sicheren und effizienten Code.
unique_ptr
shared_ptr
weak_ptr
make_*
get()
RAII
auto u = std::make_unique<T>(args); ·
auto s = std::make_shared<T>(args); ·
std::weak_ptr<T> w = s;