2.10.1 – Метаметоды сборщика мусора
Используя C API,
мы можем определить метаметоды сборщика для данных типа userdata (смотрите §2.8). Эти метаметоды также называются
файнолайзерами. Файнолайзер позволяет вам координировать работу сборщика мусора
Lua с внешними менеджерами ресурсов (например при закрытии файлов, сетевых
подключений и подключений к базам данных, или же при освобождении собственной
памяти).
Данные сборщика мусора с полем __gc в собственной метатаблице не хранятся непосредственно в нем.
Вместо этого Lua сохраняет их в списке. После сбора мусора Lua выполняет над этими данными функцию, эквивалентную:
function gc_event (udata) local h = metatable(udata).__gc if h then h(udata) end end
После каждого цикла сбора, финализаторы каждого элемента данных вызываются в
порядке, обратном порядку их создания в цикле. Таким образом, первый файнолайзер
будет вызван для объекта, созданного последним..
|