2

我正在使用 NLua 从 C# 编译 lua 代码。问题是在 C# 中创建的 LuaTables 不能被 Lua 垃圾收集器完全处理掉。

这是示例代码:

        public static List<LuaTable> TempTables = new List<LuaTable>();

    static void Main(string[] args)
    {
        using (Lua lua = new Lua())
        {
            double mem = (double)lua.DoString("return collectgarbage(\"count\")")[0];
            for (int i = 0; i < 100000; i++)
            {
                LuaTable lt = NewTab(lua);
            }


            mem = (double)lua.DoString("return collectgarbage(\"count\")")[0];
            foreach (LuaTable lt in TempTables)
            {
                lt.Dispose();
            }
            TempTables.Clear();

            lua.DoString("collectgarbage()");
            mem = (double)lua.DoString("return collectgarbage(\"count\")")[0];
        }
    }
    public static LuaTable NewTab(Lua l)
    {            
        LuaTable lt = (LuaTable)l.DoString("return {}")[0];
        TempTables.Add(lt);
        return lt;
    }

这段代码简单地创建了 100 000 个表,然后在 C# 中处理它并在 lua 中调用垃圾收集。使用的内存可以在变量“mem”中检查。结果是“mem”将从 22.04Kb 增加到大约。1000KB。这意味着以这种方式处理会导致内存泄漏。

但是,如果我们立即处理 LuaTable:

            for (int i = 0; i < 100000; i++)
            {
                LuaTable lt = NewTab(lua);
                lt.Dispose();
            }

它运作良好。“mem”保持不变+-1Kb。

为什么会这样?我应该如何处理 Lua 对象以使其完全可供 lua gc 访问?

4

0 回答 0