C++ Academy · Lektion

Benutzerdefinierte Deleter und Make-Funktionen

Verwenden Sie std::make_unique, std::make_shared und benutzerdefinierte Deleter für Ressourcen, die nicht aus Speicher bestehen.

Lektion 4 von 413 Schritte

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 new im 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.

Kostenlos starten

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

  1. Warum Smart Pointer rohe new- und delete-Operatoren ersetzen
  2. unique_ptr und exklusiver Besitz
  3. shared_ptr und weak_ptr: geteilte Besitzverhältnisse
  4. Benutzerdefinierte Deleter und Make-Funktionen
← Zurück zu C++ Academy