Lua 在用户数据对象中添加 lua table 时内存泄漏

Lua memory leak when add lua table in userdata object

当我按下 'btn' 内存从 80M 上升到 240M。 我按下 'btn2' 删除对象(self.sprite)包括许多 lua table,但内存没有下降。

这段代码有什么问题?还是 lua 错误?

我用的是cocos2dx-3.8.1/xcode7/ios模拟器

local MainScene = class("MainScene", cc.load("mvc").ViewBase)
function MainScene:onCreate()
    local btn = ccui.Button:create("res/Button_Normal.png","res/Button_Press.png","res/Button_Disable.png")
    btn:setScale9Enabled(true)
    btn:setContentSize(cc.size(70,70))
    btn:setPosition(100,100)
    btn:setTitleColor(cc.c3b(0,0,0))
    btn:setTitleFontSize(30)
    btn:setTitleText("Add")
    btn:addTouchEventListener(function(ref,typ)
        if typ == ccui.TouchEventType.ended then
            self.sprite = cc.Sprite:create("res/Button_Normal.png")
            for i=1,1000000 do
                self.sprite["s_"..i] = {"abc",123}
            end
            self.sprite:setPosition(100, 200)
            self:addChild(self.sprite)
        end
    end)
    self:addChild(btn)
    local btn2 = ccui.Button:create("res/Button_Normal.png","res/Button_Press.png","res/Button_Disable.png")
    btn2:setScale9Enabled(true)
    btn2:setContentSize(cc.size(70,70))
    btn2:setPosition(200,100)
    btn2:setTitleColor(cc.c3b(0,0,0))
    btn2:setTitleFontSize(30)
    btn2:setTitleText("remove")
    btn2:addTouchEventListener(function(ref,typ)
        if typ == ccui.TouchEventType.ended then
            if self.sprite then
            self.sprite:removeFromParent(true)
            self.sprite = nil
            end
        end
    end)
    self:addChild(btn2)
end
return MainScene

可能不是内存泄漏。您可以使用 Lua 垃圾回收方法来查看 Lua 分配给这些结构的内存量。例如,尝试以下操作:

collectgarbage("count") -- #1 returns something like 2574.62890625 (in Kb)
-- allocate and release memory
collectgarbage() -- collect memory
collectgarbage()
collectgarbage("count") -- #2 check the amount of memory

您应该看到在 1 和 2 中使用的内存量大致相同(假设分配的所有内容都已释放,因为它没有任何引用),但通常您不应期望报告的内存操作系统由于碎片化而下降到原来的数量。您应该期望 Lua 继续重用它释放的内存,因此如果您再次分配相同的结构,内存总量将保持大致相同。

我怀疑 Lua 中存在内存泄漏,除非您可以在不涉及 cocos2dx 的更简单的脚本上进行演示 API.