对象有问题,不再需要但仍然有引用。结果:由于未收集对象,分配的内存大小不断增长。
如何解决此类问题?有没有办法找到只有一个引用的对象,或者生命周期超过某个值的对象?或者任何其他解决方案?
将 Lua 5.1 和 C++ 与 luabind 一起使用。
谢谢。
对象有问题,不再需要但仍然有引用。结果:由于未收集对象,分配的内存大小不断增长。
如何解决此类问题?有没有办法找到只有一个引用的对象,或者生命周期超过某个值的对象?或者任何其他解决方案?
将 Lua 5.1 和 C++ 与 luabind 一起使用。
谢谢。
正如有人在这里提到的那样,您可以尝试使用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
我不确定是否将它与 C++ 集成,但听起来垃圾收集器没有机会运行。
在您的 lua 中,您可以尝试显式调用它,看看是否有帮助。核心 apis 中有一个函数collectgarbage(opt [, arg])
。