在userdata对象中添加lua表时Lua内存泄漏

时间:2015-10-27 03:41:28

标签: memory-leaks lua cocos2d-x lua-userdata

★★★★★CODE CLICK HERE!!!★★★★★

当我按下'btn'时,内存从80M上​​升到240M。 而且我按下'btn2'来删除对象(self.sprite)包含许多lua表,但内存没有下降。

这段代码有什么问题?或者它是一个lua bug?

我使用了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

1 个答案:

答案 0 :(得分:1)

可能没有内存泄漏。您可以使用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。