【发布时间】:2020-08-04 23:08:21
【问题描述】:
我不经常使用弱表。但是现在我需要管理我的对象的某些属性,这些属性应该存储在其他地方。那是弱表派上用场的时候。我的问题是,它们不能按预期工作。我需要弱键,以便在不再引用键并且我需要强值时删除整个键/值对,因为存储的是具有元信息的表,这些表仅在该表内使用,它也有对密钥的引用,但不知何故,这些对永远不会被收集。
代码示例:
local key = { }
local value = {
ref = key,
somevalue = "Still exists"
}
local tab = setmetatable({}, { __mode = "k" })
tab[key] = value
function printtab()
for k, v in pairs(tab) do
print(v.somevalue)
end
end
printtab()
key = nil
value = nil
print("Delete values")
collectgarbage()
printtab()
预期输出:
Still exists
Delete values
得到:
Still exists
Delete values
Still exists
为什么没有删除键/值对?对 value 的唯一引用实际上是 tab 内的弱引用,并且 value 内的引用不相关,因为 value 本身没有在任何地方使用。
【问题讨论】:
-
你的 Lua 版本是多少?
-
@EgorSkriptunoff Lua 5.1
标签: memory-leaks lua garbage-collection weak-references