什么是弱引用?

我试图理解弱表/弱引用,但还是无法理解。

> "弱引用是不被垃圾回收器考虑的对象的引用"

我在《Lua 编程基础》第一版中看到了这个,但接下来的内容让我真的很困惑

> "也就是说,如果一个对象只在弱表中保留,Lua 最终会回收该对象"

还有这个(虽然不是从书上获取的)

> "当一个对象有 0 个引用时,该对象被视为“垃圾”"

local t = {x = val} -- x 是一个弱引用,因为移除 val 后,val 不被视为“垃圾”,x 仍然是 val 的一个引用

val = nil

collectgarbage() -- 你期望 {} 被回收

for i, v in pairs(t) do
    print(v) -- 打印表
end

这个对象只在一个弱表(即 t)中保留,但 Lua 并没有回收它。我仍然可以打印表,表并没有被垃圾回收器抛弃。

《Lua 5.1 参考手册》也证实了这个信息

> "换句话说,如果一个对象只有弱引用,垃圾收集器将回收此对象。"

我收集的信息或者我展示的代码有什么问题吗?我很糟糕地学习东西,所以必须问很多问题。 如果是的话,请给我正确的信息和一些具体的示例。

编辑:我现在理解了弱表和弱引用的工作原理,我还学到了一个新东西,这个东西是关于 table.insert() 的:我可以用 table.insert() 插入表格,这听起来很棒。

点赞
用户4984564
用户4984564

首先,你必须将表声明为弱表(即具有弱键或弱值或两者均具有)。

local weak = setmetatable({}, {__mode="v"}) -- 使用弱值创建弱表

然后,你可以将对象存储在表中。

table.insert(weak, {"hello", "world"})

由于除了作为表中的值之外,没有其他对该对象的引用,因此它将在下一次运行垃圾回收时被回收。整个键值对将从表中消失,表将变为空,因为没有其他键值对存在。

2020-07-27 08:26:58