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: resourceMuster 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
})
endReihenfolge 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
})
endEinschrä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
endPraktischer 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
- Grundlagen des Lua-Garbage-Collectors
- Schwache Schlüssel und schwache Werte
- Finalizer mit __gc
- Speicherlecks vermeiden