在Lua丢失了引用

时间:2009-12-17 15:12:13

标签: memory-leaks lua garbage-collection luabind

对象出现问题,不再需要但仍有引用。 结果:由于未收集对象,分配的内存大小不断增加。

如何解决这类问题? 有没有办法找到只有一个引用的对象,或者生命周期超过某个值的对象?或者任何其他解决方案?

将lua 5.1和C ++与luabind一起使用。

感谢。

2 个答案:

答案 0 :(得分:5)

正如有人在此提及,您可以尝试使用weak tables

如果你有这样的代码:

myListOfObjects = {}
...
table.insert(myListOfObject, anObject)

然后一旦anObject停止使用,它将永远不会被释放,因为myListOfObjects仍然引用它。

您可以尝试删除myListOfObjects中的引用(将引用设置为nil),但更简单的解决方案是将myListOfObjects声明为弱表

myListOfObjects = {}
setmetatable(myListOfObjects, { __mode = 'v' }) --myListOfObjects is now weak

鉴于setmetatable返回对其修改的表的引用,您可以使用这个更短的习语,它与前两行相同:

myListOfObjects = setmetatable({}, {__mode = 'v' }) --creation of a weak table

答案 1 :(得分:1)

我不确定是否将它与C ++集成,但听起来垃圾收集器没有机会运行。

在你的lua中你可以尝试显式调用它,看看是否有帮助。核心apis collectgarbage(opt [, arg])中有一个函数。