2015-10-27 61 views
-4

★★★★★CODE CLICK HERE!!!★★★★★的Lua內存泄漏時在用戶數據對象

當我按「BTN」存儲器加載LUA表從80M上​​升到240M。 而我按'btn2'刪除對象(self.sprite)包含許多lua表,但內存沒有下降。

這段代碼有什麼問題?或者它是一個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 
+0

請直接將代碼帶到帖子中。這樣,沒有人需要點擊鏈接來查看你有什麼代碼。此外,請參閱是否可以將其分解爲具體導致增加的因素。謝謝! – Josh

+0

您是否等待垃圾收集器運行?你是否強迫它運行?你強迫過兩次嗎? –

+0

@Josh感謝您的建議。 – superyyl

回答

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的更簡單的腳本上演示它。

+0

謝謝。 #1和#2打印使用的相同數量的內存。 – superyyl

+0

這意味着Lua收集並釋放了它在呼叫之間分配的所有內存,這是您通常所期望的。這並不意味着操作系統重新獲得內存或者在cocos2dx中沒有泄漏。 –