所以我暴露了复杂的数据对象,这些对象完全是在C ++环境中创建的,但最近我已经做到了这一点,所以Lua也可以创建这些对象的实例。我使用UserData来跟踪分配的发生位置,所以当__gc被调用时,它知道它应该做什么。
Lua是否足够聪明,知道它创建的用户数据的引用存储在它没有创建的用户数据块中?
代码示例
function AddNewSubjObject(containerId, subObjectType)
local containerObject = meta_ContainerObject:getContainer(containerId)
local newSubObject = meta_SubObject:CreateNew(subObjectType)
containerObject.AddChild(newSubObject)
return containerObject;
end
我们获得了一个可以包含其他对象的userdata对象的局部变量。然后我们创建一个新对象,它唯一的跟踪是在Lua中。最后,我们调用一个方法将子对象存储在容器对象中。
当这个函数返回时,对我来说它看起来已经删除了对newSubObject的所有引用,所以我担心它会删除为它分配的内存,即使它仍然被引用..
这是不是通过不正确清理对象来泄漏内存,还是会在仍然可能使用它时将其删除来破坏内存?基本上我想知道这是否是在通过Lua公开userdata时必须考虑和处理的情况。
答案 0 :(得分:2)
Lua垃圾收集器不会查看userdata。
Lua提供弱表来管理这些类型的引用。见firefly-math-linear-real。您可以使用具有subObjects的弱键和subObject容器值的表。收集容器时,也会收集子对象。