对象出现问题,不再需要但仍有引用。 结果:由于未收集对象,分配的内存大小不断增加。
如何解决这类问题? 有没有办法找到只有一个引用的对象,或者生命周期超过某个值的对象?或者任何其他解决方案?
将lua 5.1和C ++与luabind一起使用。
感谢。
答案 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])
中有一个函数。