存在对象的问题,不再需要但仍有引用。 结果:由于未收集对象,分配内存的大小不断增长。Lua中失去引用
如何解决这类问题? 有没有什么方法可以找到只有一个引用的对象,或者一生中超过某个值的对象?还是有其他解决方案?
在luabind中使用Lua 5.1和C++。
谢谢。
存在对象的问题,不再需要但仍有引用。 结果:由于未收集对象,分配内存的大小不断增长。Lua中失去引用
如何解决这类问题? 有没有什么方法可以找到只有一个引用的对象,或者一生中超过某个值的对象?还是有其他解决方案?
在luabind中使用Lua 5.1和C++。
谢谢。
有人在这里提到,你可以尝试使用weak tables。
如果你有像这样的代码:
myListOfObjects = {}
...
table.insert(myListOfObject, anObject)
然后,一旦被使用anObject
停止,它永远不会被释放,因为myListOfObjects
仍然引用它。
你可以尝试去除myListOfObjects
参考(设定参考为零),但一个简单的解决方案正在申报myListOfObjects
为弱表:
myListOfObjects = {}
setmetatable(myListOfObjects, { __mode = 'v' }) --myListOfObjects is now weak
鉴于setmetatable
返回表中的引用它修改,你可以使用这个较短的成语,这与前两行相同:
myListOfObjects = setmetatable({}, {__mode = 'v' }) --creation of a weak table
弱表是一个很好的机制,但如何找到在弱表中使用适当的对象?项目中有大约2Mb的lua代码,找到哪些对象没有被释放并且仍然有参考是有问题的。将所有表转换为弱表将导致对象过早销毁。此外,表格主要用于取得对象的所有权并仅在必要时释放它们。问题是,并非所有的参考文献都已发布,我无法找到它们。 – kFk 2009-12-19 17:13:57
如果您不确定哪些表应该很弱,那么您唯一的工作方式是将所有引用设置为零,当它们停止有用时。 我建议您为所有“类”(表格类型)实施“析构函数”方法。应该在不再需要的对象上调用这个析构函数方法,并且应该等于它们对nil的引用。另外,对于“对象列表”,实现一个“释放”方法,将nil分配给引用。 – kikito 2009-12-21 10:54:44
你有没有机会保持或泄漏luabind :: object实例? – sbk 2009-12-17 17:31:22
也许保持。不会泄漏,因为所有的luabind :: object实例都是在堆栈中创建的,并且C++代码中没有这样的泄漏。 – kFk 2009-12-18 08:52:18