unique_ptr und exklusiver Besitz
Drücken Sie Semantik mit genau einem Besitzer mithilfe von unique_ptr und Move-only-Typen aus.
unique_ptr und exklusiver Besitz ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 2 von 4. Du kannst die komplette Lektion unten kostenlos lesen – dann übst du sie direkt im Browser mit einem integrierten Code-Editor und einem KI-Tutor rund um die Uhr. Sie ist Teil des C++ Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Der Smart Pointer mit Alleinbesitz
std::unique_ptr<T> besitzt ein Heap-Objekt. Wenn der unique_ptr zerstört wird, löscht er das Objekt. Er kann nicht kopiert, sondern nur verschoben werden.
unique_ptr erstellen
Verwenden Sie std::make_unique (C++14) – ausnahmesicher und kompakt.
#include <memory>
auto w = std::make_unique<Widget>(); // default-constructed
auto p = std::make_unique<Point>(3, 4); // forwarded argsWie einen Pointer verwenden
unique_ptr unterstützt die üblichen Pointer-Operationen.
auto p = std::make_unique<Point>(3, 4);
std::cout << p->x; // arrow access
std::cout << (*p).y; // dereference
if (p) std::cout << "non-null";Nicht kopierbar – verschiebbar
Kopieren würde zwei Besitzer bedeuten – das widerspricht „unique“. Durch Verschieben wird der Besitz übertragen.
std::unique_ptr<int> a = std::make_unique<int>(1);
std::unique_ptr<int> b = std::move(a);
// a is now empty, b owns the intAn Funktionen übergeben
Als Wert (mit std::move): Besitz übertragen. Als Referenz: ausleihen, ohne Besitz zu übernehmen.
void consume(std::unique_ptr<Widget> w); // takes ownership
void inspect(const Widget& w); // borrows
auto w = std::make_unique<Widget>();
consume(std::move(w));
// w is now empty
inspect(*w); // (after re-creating)Aus Funktionen zurückgeben
Eine Funktion, die ein Objekt erstellt und dessen Besitz zurückgibt, sollte std::unique_ptr zurückgeben.
std::unique_ptr<Widget> create() {
return std::make_unique<Widget>();
}Zurücksetzen und Freigeben
reset() löscht das aktuelle Objekt und übernimmt optional den Besitz eines neuen. release() gibt den Besitz auf und gibt den Raw Pointer zurück.
auto p = std::make_unique<int>(10);
p.reset(new int(20)); // delete the old, own the new
int* raw = p.release(); // p is now empty
delete raw; // caller must deleteget(): Raw Pointer ausleihen
get() gibt den Raw Pointer zurück, ohne den Besitz aufzugeben. Verwenden Sie dies für Interoperabilität ohne Besitzübertragung.
auto p = std::make_unique<int>(42);
legacy_api(p.get()); // p still owns itunique_ptr für Arrays
Verwenden Sie für Arrays unique_ptr<T[]>. Der indizierte Zugriff erfolgt mit []; beim Zerstören wird delete[] aufgerufen.
auto arr = std::make_unique<int[]>(10);
arr[0] = 99;
std::cout << arr[0];Benutzerdefinierte Deleter
Geben Sie einen benutzerdefinierten Deleter als Templateparameter an, wenn es sich bei der Ressource nicht um rohen Speicher handelt, etwa bei Dateihandles oder Betriebssystemressourcen.
auto closer = [](FILE* f) { if (f) std::fclose(f); };
std::unique_ptr<FILE, decltype(closer)> file(std::fopen("a.txt","r"), closer);Leistung
Mit dem Standard-Deleter ist unique_ptr genauso groß und schnell wie ein Raw Pointer – ohne zusätzlichen Aufwand.
Kurzer Test
Warum verbietet std::unique_ptr das Kopieren?
Zusammenfassung
std::unique_ptr ist der Smart Pointer für den Standardfall: kein zusätzlicher Aufwand, exklusiver Besitz, verschiebbar, aber nicht kopierbar. Bevorzugen Sie std::make_unique zur Erstellung.
Häufig gestellte Fragen
Ist die Lektion „unique_ptr und exklusiver Besitz“ kostenlos?
Ja — der vollständige Text von „unique_ptr und exklusiver Besitz“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des C++ Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der C++ Academy-Kurs umfasst insgesamt 4 Lektionen.
Was lerne ich in „unique_ptr und exklusiver Besitz“?
Drücken Sie Semantik mit genau einem Besitzer mithilfe von unique_ptr und Move-only-Typen aus. Du übst C++ Academy mit praktischem Code, den du direkt im Browser ausführst, und ein 24/7 KI-Tutor beantwortet deine Fragen während du die Lektion bearbeitest.
Brauche ich Erfahrung, um C++ Academy zu starten?
Keine Vorkenntnisse erforderlich. C++ Academy auf CoddyKit ist für Anfänger bis fortgeschrittene Lernende strukturiert, sodass du hier starten oder von Anfang an beginnen und in deinem eigenen Tempo voranschreiten kannst. Dies ist Lektion 2 von 4.
Wie lange dauert die Lektion „unique_ptr und exklusiver Besitz“?
Die meisten CoddyKit-Lektionen dauern etwa 5–10 Minuten. Jede ist kompakt und interaktiv, sodass du stetig Fortschritte machst und genau dort weitermachst, wo du aufgehört hast – im Web und in der App.
Kann ich in dieser C++ Academy-Lektion Code schreiben und ausführen?
Ja. Jede C++ Academy-Lektion enthält einen integrierten Code-Editor, sodass du echten Code direkt in deinem Browser schreibst und ausführst und sofort KI-Feedback erhältst — ohne lokale Einrichtung erforderlich.
Alle Lektionen in diesem Kurs
- Warum Smart Pointer rohe new- und delete-Operatoren ersetzen
- unique_ptr und exklusiver Besitz
- shared_ptr und weak_ptr: geteilte Besitzverhältnisse
- Benutzerdefinierte Deleter und Make-Funktionen