Sobes.tech
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_ptr ein bestimmtes Objekt besitzen.
  • Kein Kopieren: unique_ptr kann nicht kopiert werden. Dies verhindert Mehrfachbesitz und das Problem des "doppelten Löschens".
  • Verschiebesemantik: Das Eigentum am Objekt kann von einem unique_ptr auf einen anderen mit std::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.