0Pricing
Lua Academy · Lektion

Finalizer mit __gc

Registrieren Sie __gc-Metamethoden zur Bereinigung, wenn Objekte eingesammelt werden

Finalizer mit __gc ist eine kostenlose Lua Academy-Lektion auf CoddyKit. Dies ist Lektion 3 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 Lua Academy-Lernpfads, und dein Fortschritt wird über Web und CoddyKit-App synchronisiert. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was ist ein Finalizer?

Ein Finalizer ist eine Funktion, die vom GC unmittelbar vor der Freigabe eines Objekts aufgerufen wird. In Lua wird er über die __gc-Metamethode in der Metatabelle einer Tabelle implementiert.

Einen Finalizer festlegen

Fügen Sie einer Metatabelle eine __gc-Funktion hinzu, bevor oder während das Objekt erstellt wird.

local mt = {
  __gc = function(self)
    print("Finalizing:", self.name)
  end
}
do
  local obj = setmetatable({name = "resource"}, mt)
end
collectgarbage()  -- prints: Finalizing: resource

Muster zur Ressourcenbereinigung

Finalizer eignen sich ideal zum Freigeben externer Ressourcen: Dateihandles, Datenbankverbindungen oder C-Speicher.

local function openResource(path)
  local f = io.open(path, "r")
  return setmetatable({handle = f, path = path}, {
    __gc = function(self)
      if self.handle then
        self.handle:close()
        print("Closed:", self.path)
      end
    end
  })
end

Reihenfolge der Finalizer

Objekte mit Finalizern werden in umgekehrter Reihenfolge ihrer Erstellung gesammelt. Standardmäßig werden Finalizer einmal pro GC-Zyklus ausgeführt.

Wiederbelebung

Wenn ein Finalizer eine Referenz auf das Objekt speichert (in einer globalen Variable oder einem Upvalue), wird das Objekt wiederbelebt. Bei seiner endgültigen Sammlung wird sein Finalizer nur noch einmal aufgerufen.

Userdata und __gc

In C-Erweiterungen ist __gc für Userdata die wichtigste Möglichkeit, C-Speicher freizugeben. In reinem Lua-Code verwenden Tabellen denselben Mechanismus über Metatabellen.

Proxy-Objekte für RAII

Erstellen Sie eine Proxy-Tabelle, deren __gc die eigentliche Ressource schließt. Dies bildet RAII aus C++ nach.

local function scoped(resource, cleanup)
  return setmetatable({resource}, {
    __gc = function(self) cleanup(self[1]) end
  })
end

Einschränkungen von Finalizern

Finalizer sollten keine Coroutine-Operationen aufrufen, keine Werte zurückgeben und keine bestimmte Reihenfolge voraussetzen, in der andere Objekte noch existieren. Halten Sie sie einfach und kurz.

Schwache Tabellen und Finalizer

Objekte in schwachen Tabellen können weiterhin finalisiert werden. Nach der Finalisierung (und einer möglichen Wiederbelebung) werden sie im nächsten Zyklus vollständig eingesammelt.

Finalizer-Schutz in toLua

Verwenden Sie im Finalizer ein boolesches Flag, um im Fall einer Wiederbelebung eine doppelte Bereinigung zu verhindern.

local mt = {}
mt.__gc = function(self)
  if not self._closed then
    self._closed = true
    -- cleanup...
  end
end

Praktischer Rat

Bevorzugen Sie explizite Methoden wie :close() oder :destroy() für eine deterministische Bereinigung. Verwenden Sie __gc als Sicherheitsnetz für versehentlich ausgelassene Aufräumvorgänge, nicht als primäres Ressourcenmanagement.

Frage zu Finalizern

Wann wird die Metamethode __gc aufgerufen?

Zusammenfassung: Finalizer mit __gc

Die Metamethode __gc wird unmittelbar vor dem Einsammeln eines Objekts ausgeführt und ermöglicht eine Ressourcenbereinigung im RAII-Stil. Verwenden Sie sie als Sicherheitsnetz; bevorzugen Sie explizite close-/destroy-Methoden für ein deterministisches Ressourcenmanagement.

Häufig gestellte Fragen

Ist die Lektion „Finalizer mit __gc“ kostenlos?

Ja — der vollständige Text von „Finalizer mit __gc“ ist hier im Web kostenlos zu lesen. Um sie interaktiv zu üben (integrierter Code-Editor und 24/7 KI-Tutor) und den Rest des Lua Academy-Kurses freizuschalten, upgrade auf CoddyKit PRO. Der Lua Academy-Kurs umfasst insgesamt 4 Lektionen.

Was lerne ich in „Finalizer mit __gc“?

Registrieren Sie __gc-Metamethoden zur Bereinigung, wenn Objekte eingesammelt werden Du übst Lua 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 Lua Academy zu starten?

Keine Vorkenntnisse erforderlich. Lua 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 3 von 4.

Wie lange dauert die Lektion „Finalizer mit __gc“?

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 Lua Academy-Lektion Code schreiben und ausführen?

Ja. Jede Lua 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. Grundlagen des Lua-Garbage-Collectors
  2. Schwache Schlüssel und schwache Werte
  3. Finalizer mit __gc
  4. Speicherlecks vermeiden
← Zurück zu Lua Academy