首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LuaInterface内存泄漏问题

LuaInterface内存泄漏问题
EN

Stack Overflow用户
提问于 2016-11-07 08:36:09
回答 1查看 498关注 0票数 3

我发现我在一个C#/Lua LuaInterface项目中有一个严重的内存泄漏。我用C#编写了一个简单的测试函数,它每隔0.5秒从Lua循环调用一次。我可以看到Lua memmory的使用率随着每个循环的增加而增加。我最新的C#端代码是

代码语言:javascript
复制
  public LuaTable testMemTable()
  {
     LuaTable tabx = m_lua.GetTable("tabx");

     if (tabx != null)
     {
        tabx.Dispose();
        tabx = null;

        GC.Collect();
        GC.WaitForPendingFinalizers();
     }


     m_lua.NewTable("tabx");
     tabx = m_lua.GetTable("tabx");

     for (int i = 0; i < 20000; i++)
        tabx[i] = i * 10;

     return  tabx;
  }

尽管执行了tabx.Dispose()和tabx=null,然后强制GC,但我仍然看到内存没有被释放。没有LuaInterface函数来释放以前分配的表,所以我不知道还能做些什么来释放内存?

Lua端代码非常简单

代码语言:javascript
复制
while true do

    myAPILibs.testMemTable()

    if tabx ~= nil then
        print(string.format("Size = %d", #tabx))
    else
        print(string.format("Size = nil"))
    end

    print(tabx, tabx[111])

    myAPILibs.sleep(500)

    print("Before ", collectgarbage("count") * 1024)
    collectgarbage("collect")
    print("After ", collectgarbage("count") * 1024)

end

任何帮助我解决内存泄漏问题的人都将不胜感激。

再次感谢

杰夫

EN

回答 1

Stack Overflow用户

发布于 2017-01-17 04:47:43

Short answer

lua.newTable("testTable")替换为

lua.doString("for key,value in ipairs(testTable) do testTable[key]=nil end");

将不会有内存泄漏,并且您的代码运行良好。

Long answer

假设你有这样的lua脚本:

代码语言:javascript
复制
newTable = {1,2,3,4,5,6,7,8,9,10,11,12,13,14}   
newTable = {}   

如果您在Lua端执行此操作,即使您从未实际清除原始表,也不会发生泄漏。Lua不知何故知道在重新分配表之前先处理它。

但是,如果在将表设置为空表之前有任何对它的C#引用,即使lua处理了它的内容,C#引用也不会被处理;显然,它的行为就像实例创建了一个全新的表一样。要重置该表,您需要执行以下操作:

代码语言:javascript
复制
for key,value in ipairs(testTable) do   
   testTable[key] = nil   
end

您的问题并不是真正的内存泄漏,而是您的静态Lua实例正在加载多个版本的表,因为它的重置方式。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40456209

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档