Вы делаете слишком много предположений относительно сборщика мусора. Ваши данные будут собраны в конечном итоге . В этом конкретном примере он должен работать, если вы дважды вызываете collectgarbage()
, но если у вас есть несколько циклов в вашей слабой таблице, это может занять еще больше времени.
EDIT: это действительно имеет значение только тогда, когда вы ждете __cg
событие
Я просмотрел ваш код более подробно и заметил, что у вас есть другая проблема.
Ваше значение также ссылается на ключ, создавая al oop, что, вероятно, слишком много для обработки G C вашей Lua версии. В PU C Lua 5.3 это работает, как и ожидалось, но в LuaJIT l oop, похоже, не позволяет собирать значение.
Это действительно имеет большой смысл, если подумать; насколько я могу судить, все работает: сначала удаляются слабые элементы из таблицы, когда на них больше нет ссылок, и, таким образом, их можно собирать в обычном режиме при следующем запуске G C.
Однако, когда этот шаг выполняется, ключ все еще находится в таблице, поэтому (неслабое) значение является действительной ссылкой в глазах сборщиков мусора, поскольку оно доступно из кода. Таким образом, тип G C заходит в тупик и не может удалить пару ключ-значение.
Возможные решения:
- Не сохраняйте ссылку на введите значение
- Сделайте значение слабой таблицей, чтобы оно не считалось ссылкой.
- Обновление до другой Lua версии
- Оберните ссылку в одноэлементном массиве со слабыми значениями