2009-12-17 37 views
3

存在对象的问题,不再需要但仍有引用。 结果:由于未收集对象,分配内存的大小不断增长。Lua中失去引用

如何解决这类问题? 有没有什么方法可以找到只有一个引用的对象,或者一生中超过某个值的对象?还是有其他解决方案?

在luabind中使用Lua 5.1和C++。

谢谢。

+1

你有没有机会保持或泄漏luabind :: object实例? – sbk 2009-12-17 17:31:22

+0

也许保持。不会泄漏,因为所有的luabind :: object实例都是在堆栈中创建的,并且C++代码中没有这样的泄漏。 – kFk 2009-12-18 08:52:18

回答

1

我不确定如何将它与C++集成,但它听起来像垃圾收集器没有被给予运行的机会。

在你的lua中,你可以尝试明确地调用它,看看是否有帮助。核心apis collectgarbage(opt [, arg])中有一个功能。

+0

垃圾收集定期运行,并做得很好。但它不会收集具有现有参考的对象。有很多这样的对象,我找不到它们。 – kFk 2009-12-17 15:35:10

+0

您是否患有循环引用问题? – 2009-12-17 16:16:30

+0

lua是否正确解决循环引用?如果否,可能是原因。 – kFk 2009-12-18 08:50:30

5

有人在这里提到,你可以尝试使用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 
+0

弱表是一个很好的机制,但如何找到在弱表中使用适当的对象?项目中有大约2Mb的lua代码,找到哪些对象没有被释放并且仍然有参考是有问题的。将所有表转换为弱表将导致对象过早销毁。此外,表格主要用于取得对象的所有权并仅在必要时释放它们。问题是,并非所有的参考文献都已发布,我无法找到它们。 – kFk 2009-12-19 17:13:57

+0

如果您不确定哪些表应该很弱,那么您唯一的工作方式是将所有引用设置为零,当它们停止有用时。 我建议您为所有“类”(表格类型)实施“析构函数”方法。应该在不再需要的对象上调用这个析构函数方法,并且应该等于它们对nil的引用。另外,对于“对象列表”,实现一个“释放”方法,将nil分配给引用。 – kikito 2009-12-21 10:54:44