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

因此,我正在公开复杂的数据对象,这些对象完全在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

我们获得一个本地变量到可以包含其他对象的用户数据对象。然后,我们创建一个新对象,其唯一的跟踪在Lua中。最后,我们调用一个将子对象存储在容器对象中的方法。

当此函数返回时,对我来说,它似乎已删除了所有对newSubObject的引用,因此我担心它将删除为其分配的内存,即使它仍在被引用。

这是否会通过不正确地清理对象而泄漏内存,或者通过在仍可能被使用时删除内存而破坏内存?基本上,我想知道这是否是通过Lua公开userdata时必须考虑和处理的情况。

点赞
用户33252
用户33252

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

Lua提供了弱表来管理这些引用。请参阅 PiL Chapter 17。您可以使用一个带有subObjects弱键和值的容器表,当容器被收集时,其中会包括subObjects。

2016-01-07 01:27:33