lua创建对象内存泄露

在cocos2d-x中的HelloLua工程中的hello.lua文件替换为以下代码进行测试:
function updateTime()
–隔一段时间后,确保COCOS2D对象都释放了,再次GC,再次打印LUA内存占用
collectgarbage(“collect”)
print(“memory3:”, collectgarbage(“count”))
end

updateFunc_ = CCDirector:sharedDirector():getScheduler():scheduleScriptFunc(updateTime, 60, false)

–首先GC清理干扰,并打印首次LUA占用内存
collectgarbage(“collect”)

print(“memory1:”, collectgarbage(“count”))

–以下对象没有被引用,会被自动释放
for i=1,100000 do
CCAnimation:create()
CCMenu:create()
CCLabelTTF:create()
CCScene:create()
CCLayer:create()
CCNode:create()
CCSprite:create()
end

–多次调用GC并打印LUA内存占用
collectgarbage(“collect”)
collectgarbage(“collect”)
collectgarbage(“collect”)
collectgarbage(“collect”)

print(“memory2:”, collectgarbage(“count”))

运行一段时间之后打印如下结果
memory1: 776.4794921875
memory2: 23305.096679688
memory3: 23304.478515625

按道理上面创建的大量对象会自动释放,内存应该会降下来,但是LUA占用的内存一直升高,导致程序最后被杀死,请问如何处理,谢谢大家

这个引用是以引用计数作为前提的,不是对象创建以后被赋给某个变量这种

当引用计数变为0的时候才会被GC清理掉

create()方法都有调用autorelease()
这个里面会导致引用计数变为1

所以…其实是一直在占用
目测第二次和第三次的数据比较接近,是因为系统本身强制释放了一些内存

新手路过…

你的内存当然不会降下来了,在循环中你创建的变量都是全局的,全局的变量怎么可能会释放呢,这是典型的内存泄露吧,你加上local这个作用域试试,我也是刚刚看lua,不知道说的对不对。

你是对的。

之前看过2次 ,quick框架里面有打印lua 内存泄露的代码

之前没记住

现在想测却找不到了

有知道在打印的代码在哪里的吗?

btw,以前我常看小塔的文章捏,现在都是老塔了吧

现在只找到这段,不记得是不是

if DEBUG_MEM then
local sharedTextureCache = CCTextureCache:sharedTextureCache()
----
@ignore
]]
local function showMemoryUsage()
printInfo(string.format(“LUA VM MEMORY USED: %0.2f KB”, collectgarbage(“count”)))
sharedTextureCache:dumpCachedTextureInfo()
printInfo("---------------------------------------------------")
end
sharedDirector:getScheduler():scheduleScriptFunc(showMemoryUsage, DEBUG_MEM_INTERVAL or 10.0, false)
end