首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何跟踪内存泄漏/使用Lua放弃内存?

如何跟踪内存泄漏/使用Lua放弃内存?
EN

Stack Overflow用户
提问于 2012-02-02 00:51:42
回答 2查看 2.5K关注 0票数 4

我正在使用cocos2d-x和Lua进行开发。最近我使用了Instruments,发现了一些被丢弃的内存: cocos2d-x在它自己的自动释放池中对对象执行释放,但我仍然有来自Lua的引用。如何确定这些引用是在什么时候被引用的?我需要释放该内存,以避免在空间中留下已放弃的内存分配。我唯一想到的就是使用一些Lua调试器来管理而不是nil Lua指针。

如果我只知道哪个Lua引用持有指针,我就可以手动释放它。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-02-02 01:44:00

你的问题用词有点奇怪。但据我所知,您的Lua脚本引用了外部代码中分配的对象。只要Lua有这些引用,外部代码就不会释放这些资源。你认为这些资源应该被释放。

你应该做的第一件事就是检查你的Lua接口代码是否使用了metamethods来正确地清理引用。也就是说,当Lua完成一个对象引用时,有一个附加的元方法(__gc),它将通知外部代码Lua已经完成了对象。

在这篇文章的其余部分,我将假设这段代码存在并正常运行。您应该自己验证这一点。

根据这一假设,您所看到的情况会发生以下两个原因之一:

  1. 你的Lua代码已经使用完了所有的引用,但是还没有清理它们。我的意思是,Lua脚本不再拥有任何局部变量、全局变量等中的引用。在这种情况下,发生的情况是Lua的垃圾收集器还没有运行和清理东西。所以你需要用lua_gc(L, LUA_GCCOLLECT, 0);来做这件事。如果是这种情况,那么在运行这个函数之后,来自Lua的所有引用都应该被清除。
  2. 您的Lua代码仍然具有对隐藏的外部对象的活动引用。

处理第二种情况很困难。这是Lua代码的责任是...负责任。它应该在需要引用内容时存储引用,然后在之后忘记这些引用。我的意思是,不要将值存储在非局部变量中(我所说的“非局部”,也是指避免嵌套函数定义使用的局部变量)。

没有办法找到这些引用仍然存在的位置;毕竟,Lua值不一定有名称。而且,Lua并没有给你提供一种遍历lua_State中每个可能变量的方法。即使有,也肯定没有办法简单地删除这些引用。毕竟,Lua代码仍然可以接触到它们。如果你将它们清空,当Lua代码试图与这些对象对话时,它会崩溃。因此,即使你可以做你想做的事情,它也会适得其反。

我建议使用以下三种方法中的一种:

  1. 在您的脚本中执行纪律。确保您知道所有非Lua对象的存储位置。确保这些对象在它们应该释放的时候被释放。知道你把这些外部对象放在哪里,并确保它们按时释放。所谓“发布”,我的意思是简单地用nil.
  2. Build覆盖它们的值,在脚本和源代码之间建立一层隔离。不是直接给Lua指向Cocos2D-X对象的指针,而是给它指向一个特殊对象的指针,该对象可能包含对Cocos2D-X对象的引用。这样,您就可以通过告诉此控件对象删除其引用来控制何时直接释放这些对象。如果Lua调用一个空的控件对象,该函数将返回...一些无害的东西(这样你就不会崩溃)。显然,Lua应该有一个函数来检查它是否是一个有效的控制对象。
  3. 在Lua中做你想做的任何事情,但是在释放资源的时候销毁整个Lua状态。您当前的方法是非常细粒度的。Lua创建一些资源,然后Lua决定它们何时消失。一种更严格的资源管理方案是让Lua脚本加载一些资源并引用资源。但是,当需要销毁所有这些资源时,您只需对lua_State本身执行lua_close操作。这将释放所有引用,从而释放这些资源。问题解决了。
票数 3
EN

Stack Overflow用户

发布于 2013-06-05 04:05:27

我也遇到过这个问题。

不幸的是,尽管Lua脚本引擎引用了对象,Cocos2d-x仍然可以破坏CCObjects。看起来这个绑定并不完美。

你可以通过在静态包中创建一个CCNode,然后添加一个不同的CCNode到场景中,然后删除它(触发清理),然后等待帧更新来测试这一点。尽管有一个有效的lua引用,原始的CCNode对象将会消失,并且试图在Lua中调用它的方法会抛出错误,尽管对象~=为空。

您可以通过创建一个CCMutableArray_CCObject__对象并向其中添加CCObjects来解决此问题。这增加了这些对象的引用计数,如果不对lua引用进行gc,CCMutableArray_CCObject__将不会被gc。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9099791

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档