管理 Lua light userdata 的正确方法

我有一个指向由 C++ 创建的对象的 void *,我使用 lua_pushlightuserdata() 将其传递给 Lua。Lua 可以通过将其传递给 Lua C 函数并使用 lua_touserdata() 检索它来执行一些操作。在将来的某个时间点,C++ 对象将被其所有者(C++)销毁,内存被释放,并设置为 null。但是,Lua 仍然引用此指针,它不知道它已经被销毁。

现在,我的 Lua 函数检查该 userdata 指针是否有效。但是,通知 Lua 它们对 light userdata 的引用不再有效的最佳方法是什么?我要向 Lua 公开一个 IsValid(lightuserdata) 函数以便它可以查询状态吗?还是我错过了更好的方法。

点赞
用户5675002
用户5675002

在我的经验中,我发现使 Lua 拥有对象更容易,并且需要 full userdata 来存储指针或完整对象在 userdata 内存区域中。Full userdata 可以有元表和 __gc 元方法,因此对象将仅在最后一个引用在 Lua 侧进行垃圾收集后被销毁。

至少不要通过 lightuserdata 向 Lua 公开原始指针以控制本地对象,这对本地对象的生命周期管理实际上并不起作用。使其成为 Lua 拥有的对象。在最简单的情况下,它可以是一个 Lua 对象(full userdata),它持有对真实本地对象的智能指针。

2018-09-01 19:22:03