Lua如何处理将创建的内容存储到userdata中?

时间:2016-01-07 00:28:18

标签: lua

所以我暴露了复杂的数据对象,这些对象完全是在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时必须考虑和处理的情况。

1 个答案:

答案 0 :(得分:2)

Lua垃圾收集器不会查看userdata。

Lua提供弱表来管理这些类型的引用。见firefly-math-linear-real。您可以使用具有subObjects的弱键和subObject容器值的表。收集容器时,也会收集子对象。