3

我有void *一个 C++ 创建的对象,我使用lua_pushlightuserdata(). Lua 可以通过将轻量用户数据传递给 Lua CFunctions 并使用lua_touserdata(). 在将来的某个时刻,C++ 对象被其所有者 (C++) 破坏,释放内存并设置为 null。但是,Lua 仍然有这个指针的引用,它并不知道它已经被销毁了。

现在我的 Lua 函数接受这个用户数据确保指针是有效的。但是通知 Lua 他们对轻用户数据的引用不再有效的最佳方法是什么?我是否IsValid(lightuserdata)向 Lua 公开了一个函数以便它可以查询状态?或者有没有更好的方法,我错过了。

4

1 回答 1

2

根据我的经验,我发现让 Lua 拥有对象更容易,并且您需要完整的用户数据来保存用户数据内存区域中的指针或完整的对象。完整的用户数据可以使用元方法具有元表__gc,因此只有在 Lua 端对最后一个引用进行垃圾收集后才会销毁对象。

至少不要通过 向 Lua 公开指向本机对象的原始指针lightuserdata,它实际上不适用于本机对象的生命周期管理。使其成为 Lua 拥有的对象。在最简单的情况下,它可能是一个 Lua 对象(完整的用户数据),它持有指向真实本机对象的智能指针。

于 2018-09-01T19:22:03.050 回答