Benutzerdefinierte Deleter und Make-Funktionen
Verwenden Sie std::make_unique, std::make_shared und benutzerdefinierte Deleter für Ressourcen, die nicht aus Speicher bestehen.
Benutzerdefinierte Deleter und Make-Funktionen ist eine kostenlose C++ Academy-Lektion auf CoddyKit. Dies ist Lektion 4 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.
Warum benutzerdefinierte Deleter?
Nicht jede Ressource wird mit delete freigegeben. Datei-Handles, Sockets, betriebssystemspezifische Ressourcen und Arrays benötigen jeweils eine andere Bereinigungsfunktion.
Standard-Deleter für unique_ptr
Standardmäßig verwendet unique_ptr<T> delete. Für Arrays verwenden Sie unique_ptr<T[]>, das delete[] aufruft.
Einen benutzerdefinierten Deleter angeben
Übergeben Sie ein aufrufbares Objekt als zweites Template-Argument. Der Deleter erhält den Raw Pointer und gibt ihn auf geeignete Weise frei.
auto closer = [](FILE* f) { if (f) std::fclose(f); };
std::unique_ptr<FILE, decltype(closer)> file(
std::fopen("data.txt", "r"), closer);Deleter für shared_ptr
shared_ptr speichert seinen Deleter im Kontrollblock – der Typ wird ausgelöscht, daher ändert sich der Typ des shared_ptr selbst nicht.
std::shared_ptr<FILE> file(
std::fopen("data.txt", "r"),
[](FILE* f) { if (f) std::fclose(f); }
);Häufige Anwendungsfälle für benutzerdefinierte Deleter
Beispiele aus der Praxis:
- Handles von C-Bibliotheken (FILE*, sqlite3*, curl-Handles)
- Betriebssystemressourcen (HANDLE unter Windows, fd unter Unix)
- Benutzerdefinierte Speicherpools
- Externe Objekte mit Referenzzählung
std::make_unique (C++14)
Die empfohlene Methode zum Erzeugen eines unique_ptr. Sie leitet Argumente an den Konstruktor weiter und vermeidet rohes new.
auto p = std::make_unique<Widget>(arg1, arg2);Warum make_unique?
Drei Vorteile:
- Ausnahmesicherheit – kein rohes
newim Benutzercode - Der Typ muss nicht zweimal geschrieben werden
- Der Raw Pointer kann nicht versehentlich an zwei unique_ptrs übergeben werden
std::make_shared
Für shared_ptr reserviert make_shared den Kontrollblock und das Objekt in einer einzigen Heap-Allokation – schneller als getrennte Allokationen.
auto p = std::make_shared<Widget>(arg1, arg2);Wann make_shared Nachteile hat
Durch die eine Allokation wird der Speicher des Objekts erst freigegeben, wenn auch alle weak_ptrs nicht mehr vorhanden sind. Wenn Ihre weak_ptrs länger leben als die shared_ptrs, bevorzugen Sie die Konstruktion in zwei Schritten.
Benutzerdefinierte Deleter mit make kombinieren
make_unique und make_shared akzeptieren nicht direkt einen benutzerdefinierten Deleter. Erzeugen Sie den Smart Pointer in diesem Fall manuell.
// make_shared cannot take a deleter
std::shared_ptr<FILE> file(
std::fopen("data.txt", "r"),
[](FILE* f) { if (f) std::fclose(f); }
);Fallstrick: Lambda-Typ als Template-Parameter
Jedes Lambda hat einen eindeutigen Typ. Verwenden Sie bei unique_ptr beim Deklarieren decltype(my_deleter); alternativ können Sie eine benannte Funktion oder einen Funktionszeiger verwenden, um die Typen einfach zu halten.
Schnelltest
Mit welcher Factory-Funktion können Sie einen std::shared_ptr und seinen Kontrollblock in einer einzigen Heap-Allokation reservieren?
Zusammenfassung
Verwenden Sie make_unique und make_shared für die üblichen Fälle. Stellen Sie einen benutzerdefinierten Deleter (ein Lambda oder eine Funktion) bereit, wenn die Ressource mehr als delete benötigt – etwa Datei-Handles, Betriebssystemobjekte oder die Bereinigung durch eine C-Bibliothek.
Lerne C++ mit einem KI-Tutor — kostenlos
Schreibe und führe echten Code in deinem Browser aus, bekomme sofortige Hilfe von einem 24/7 KI-Tutor und setze dein Lernen im Web oder in der App fort.
- Kurse
- 51
- Lektionen
- 203
Häufig gestellte Fragen
Ist die Lektion „Benutzerdefinierte Deleter und Make-Funktionen“ kostenlos?
Ja — der vollständige Text von „Benutzerdefinierte Deleter und Make-Funktionen“ 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 „Benutzerdefinierte Deleter und Make-Funktionen“?
Verwenden Sie std::make_unique, std::make_shared und benutzerdefinierte Deleter für Ressourcen, die nicht aus Speicher bestehen. 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 4 von 4.
Wie lange dauert die Lektion „Benutzerdefinierte Deleter und Make-Funktionen“?
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