我正在使用cocos2d-x和Lua进行开发。最近我使用了Instruments,发现了一些被丢弃的内存: cocos2d-x在它自己的自动释放池中对对象执行释放,但我仍然有来自Lua的引用。如何确定这些引用是在什么时候被引用的?我需要释放该内存,以避免在空间中留下已放弃的内存分配。我唯一想到的就是使用一些Lua调试器来管理而不是nil Lua指针。
如果我只知道哪个Lua引用持有指针,我就可以手动释放它。
发布于 2012-02-02 01:44:00
你的问题用词有点奇怪。但据我所知,您的Lua脚本引用了外部代码中分配的对象。只要Lua有这些引用,外部代码就不会释放这些资源。你认为这些资源应该被释放。
你应该做的第一件事就是检查你的Lua接口代码是否使用了metamethods来正确地清理引用。也就是说,当Lua完成一个对象引用时,有一个附加的元方法(__gc),它将通知外部代码Lua已经完成了对象。
在这篇文章的其余部分,我将假设这段代码存在并正常运行。您应该自己验证这一点。
根据这一假设,您所看到的情况会发生以下两个原因之一:
lua_gc(L, LUA_GCCOLLECT, 0);来做这件事。如果是这种情况,那么在运行这个函数之后,来自Lua的所有引用都应该被清除。处理第二种情况很困难。这是Lua代码的责任是...负责任。它应该在需要引用内容时存储引用,然后在之后忘记这些引用。我的意思是,不要将值存储在非局部变量中(我所说的“非局部”,也是指避免嵌套函数定义使用的局部变量)。
没有办法找到这些引用仍然存在的位置;毕竟,Lua值不一定有名称。而且,Lua并没有给你提供一种遍历lua_State中每个可能变量的方法。即使有,也肯定没有办法简单地删除这些引用。毕竟,Lua代码仍然可以接触到它们。如果你将它们清空,当Lua代码试图与这些对象对话时,它会崩溃。因此,即使你可以做你想做的事情,它也会适得其反。
我建议使用以下三种方法中的一种:
nil.lua_State本身执行lua_close操作。这将释放所有引用,从而释放这些资源。问题解决了。发布于 2013-06-05 04:05:27
我也遇到过这个问题。
不幸的是,尽管Lua脚本引擎引用了对象,Cocos2d-x仍然可以破坏CCObjects。看起来这个绑定并不完美。
你可以通过在静态包中创建一个CCNode,然后添加一个不同的CCNode到场景中,然后删除它(触发清理),然后等待帧更新来测试这一点。尽管有一个有效的lua引用,原始的CCNode对象将会消失,并且试图在Lua中调用它的方法会抛出错误,尽管对象~=为空。
您可以通过创建一个CCMutableArray_CCObject__对象并向其中添加CCObjects来解决此问题。这增加了这些对象的引用计数,如果不对lua引用进行gc,CCMutableArray_CCObject__将不会被gc。
https://stackoverflow.com/questions/9099791
复制相似问题