我对C ++创建的对象有一个void *
,我使用lua_pushlightuserdata()
将该对象传递给Lua。 Lua可以通过将其传递给Lua CFunctions并使用lua_touserdata()
对其进行检索,从而对该灯光用户数据执行一些操作。将来的某个时候,C ++对象会被其所有者(C ++)破坏,释放内存并设置为null。但是,Lua仍然有对该指针的引用,它不知道它已被销毁。
现在,使用此用户数据的Lua函数确保指针有效。但是,通知Lua对其轻量用户数据的引用不再有效的最佳方法是什么?我是否向Lua公开了一个IsValid(lightuserdata)
函数,以便它可以查询状态?还是我缺少一种更好的方法。
答案 0 :(得分:2)
根据我的经验,我发现让Lua拥有对象更容易,并且您需要完整的userdata才能将指针或完整的对象保存在userdata存储区域内。完整的用户数据可以使用__gc
元方法进行元表化,因此只有在Lua端对最后一个引用进行垃圾回收之后,对象才会被销毁。
至少不要通过lightuserdata
向Lua公开指向本地对象的原始指针,对于本地对象的生命周期管理它实际上并不起作用。使它成为Lua拥有的某个对象。在最简单的情况下,它可能是一个Lua对象(完整的用户数据),该对象持有指向实际本机对象的智能指针。