Middle
Wie funktioniert unique_ptr in C++?
sobes.tech KI
Antwort von AI
std::unique_ptr — ist ein Smart-Pointer, der das exklusive Eigentum an einem dynamisch allozierten Objekt implementiert. Er sorgt für eine automatische Speicherverwaltung: Das Objekt, auf das unique_ptr zeigt, wird beim Zerstören von unique_ptr automatisch gelöscht.
Wichtige Merkmale:
- Exklusives Eigentum: Zu jedem Zeitpunkt kann nur ein
unique_ptrein bestimmtes Objekt besitzen. - Kein Kopieren:
unique_ptrkann nicht kopiert werden. Dies verhindert Mehrfachbesitz und das Problem des "doppelten Löschens". - Verschiebesemantik: Das Eigentum am Objekt kann von einem
unique_ptrauf einen anderen mitstd::moveübertragen werden. - Anpassbarer Deleter: Es kann ein eigener Deleter bereitgestellt werden, um spezifische Freigabemethoden zu steuern.
Der Arbeitsprinzip basiert auf RAII (Resource Acquisition Is Initialization): Die Ressource (dynamisch alloziierter Speicher) wird beim Erstellen des Objekts (unique_ptr) erworben und beim Zerstören freigegeben.
#include <memory> // Für unique_ptr
#include <iostream>
class MyClass {
public:
MyClass() { std::cout << "MyClass erstellt\n"; }
~MyClass() { std::cout << "MyClass zerstört\n"; }
};
int main() {
{
// Erstellen eines unique_ptr, der ein MyClass-Objekt besitzt
std::unique_ptr<MyClass> ptr1 = std::make_unique<MyClass>();
// Momentan ist ptr1 der exklusive Eigentümer des Objekts
// auto ptr2 = ptr1; // Kompilierungsfehler: Kopieren verboten
// Eigentumsübertragung von ptr1 zu ptr2
std::unique_ptr<MyClass> ptr2 = std::move(ptr1);
// Nach der Verschiebung besitzt ptr1 kein Objekt mehr (ist nullptr)
if (!ptr1) {
std::cout << "ptr1 besitzt kein Objekt: " << (ptr1 ? "Ja" : "Nein") << "\n";
}
// Der Gültigkeitsbereich von ptr2 endet hier.
// ptr2 wird zerstört, und das MyClass-Objekt, das es besitzt, wird automatisch gelöscht.
} // Das MyClass-Objekt wird hier zerstört
std::cout << "Ende main.\n";
return 0;
}
Vergleich mit raw pointer:
| Merkmal | raw pointer |
std::unique_ptr |
|---|---|---|
| Eigentum am Ressourcen | Nicht definiert | Exklusiv |
| Automatisches Löschen | Nein | Ja |
| Kopiersemantik | Ja | Nein (nur Verschiebung) |
| Risiko von Speicherverlust | Hohes Risiko | Geringes Risiko |
Insgesamt ist unique_ptr die bevorzugte Methode zur Verwaltung dynamischer Speicher in C++11 und höher, wenn strikte Eigentumsverhältnisse und automatische Freigabe erforderlich sind.