一些背景知识:我在不同的Lua表中跟踪不同的硬件资源 - 对于每个硬件资源,我都有一个相应的Lua表。为了管理所有资源,我认为创建一个主表是有意义的,如果硬件资源是免费的,只需将对应表调整为零即可。
下面的示例显示一个表似乎将其中的另一个表链接为referance;但是,如果我将nil分配给表键,则只将键设置为nil,而不是我实际希望的表本身。 (请参阅最后5行的输出。)
local mainTable = {}
local subTable = {x = 123}
mainTable.subkey = subTable
print("The same value.")
print(mainTable.subkey.x)
print(subTable.x)
print("---")
print("The same value.")
mainTable.subkey.x = 456
print(mainTable.subkey.x)
print(subTable.x)
print("---")
print("Tables seem to have the same address.")
print(mainTable.subkey)
print(subTable)
print("---")
print("SubTable seems still to exist, even referance was set to nil")
mainTable.subkey = nil
print(mainTable.subkey)
print(subTable)
print(subTable.x)
输出:
The same value.
123
123
---
The same value.
456
456
---
Tables seem to have the same address.
table: 0x7f17a41596d0
table: 0x7f17a41596d0
---
SubTable seems still to exist, even referance was set to nil
nil
table: 0x7f4b48151710
456
是否有可能在不设置subTable = nil和mainTable.subkey = nil的情况下从subTable中删除intire内容? (所以最后调用了subTable的__gc方法。)
答案 0 :(得分:0)
local mainTable = {}
local subTable = {}
在此代码中,您将创建两个表变量。一个由mainTable引用,另一个由subTable引用。
mainTable.subTable = subTable
现在我们在已经有引用subTable的表中添加了另一个引用mainTable.subTable。所以这个表变量没有两个引用。
这一行:
mainTable.subTable = nil
只会删除两个引用中的一个。因此,subTable仍然是该表的有效引用。只要有对该表的任何引用,垃圾收集器就不会触及它。
为了摆脱一个表,你必须删除所有引用。您无法直接删除表格。