如果我的userdata被用作其他地方的键,如何处理Lua内存/引用?

我正在使用我的用户数据(让我们称其为Turret)对一些表进行索引-以存储一些相关变量,如子弹和装甲。

我需要通过将其设置为nil来管理Turret的生命周期,随后允许Lua对其进行GC。我担心当我在其他地方将其用作键时,我会失去对对象内存的所有控制权。

示例代码:

local turretStorage = {}

-- Bunch of turrets are created and added, lets look at the one below

local turret = load.newTurret(15) -- Create a Turret userdata
turretStorage[turret] = {}
turretStorage[turret].bullets = 100
turretStorage[turret].decal = "skulls.png"

-- Some time passes, we're done with the turret object
turretStorage[turret] = nil
turret = nil

我担心turret userdata的索引。 turret userdata是否会被GC?如果将turretStorage [..]设置为nil会删除键引用-您可以向我展示支持文件吗?

我是否应该在turretStorage表中将键值设为nil?如果是这样,我该如何操作?

如果该键被用作原始变量的参考,并且无法删除,则我被卡住了并需要帮助或重构。

如果在此示例中使用的键只是userdata的内存位置,用作唯一索引-那么我完全清楚了;但是,回答问题需要引用来支持这一点;)

点赞
用户107090
用户107090

在 Lua 中,只有当没有任何内部引用指向一个对象时,它才被视为垃圾并被标记为可收集。在表中使用一个值作为键也被视为一个引用。

如果符合设计要求,可以考虑使用弱表

2014-06-24 10:45:46