什么时候可以在C++中调用lua_gc函数并使用lua_newuserdata函数

下面的例子只是为了演示问题/问题; 在现实中,我有许多创建和返回不同userdata对象的函数,而在其中一些函数之间,我可能想通过调用Lua垃圾回收器。此外,我使用Lua版本 5.3.3,在Windows和Linux上运行。由于简单起见,没有显示错误处理。

我有一个C ++类,通过标准userdata向Lua公开,如Roberto Ierusalimschy的“Programming in Lua”中所述。我的问题是,我不确定Lua何时确实具有对我的对象的引用,因此何时可以通过C ++ lua_gc函数调用垃圾回收器?

例如,我有标准的Foo C ++类,具有构造函数和析构函数。并定义了一个名为“FOO”的metatable,其中__gc条目函数称为ReleaseFoo,如下所示。

我通过以下C ++代码在Lua中创建一个实例:

static int NewFoo(lua_State * L)
{
  Foo ** foo; 
  foo = (Foo **)lua_newuserdata(L,sizeof(Foo **)); 
  * foo = new Foo(); 
  luaL_getmetatable(L,“FOO”); 
  lua_setmetatable(L,-2); 

  //问题:我可以在这里调用lua_gc(L,LUA_GCCOLLECT,0)吗,而不必冒着我的用户数据对象被垃圾收集的风险吗。 
  //因为我看到Lua还没有引用我的用户数据对象。 

  return 1; 
} 

static int ReleaseFoo(lua_State * L)
{
  Foo * foo = *(Foo **)lua_touserdata(L,1); 
  if(foo)
  {
    delete foo; 
     foo = NULL; 
  }
  返回0;
}

在Lua中,它的使用将如下所示(因此,仅在C ++函数NewFoo(L)返回后才建立引用,但我可以像显示的那样调用垃圾回收器吗?):

LUA> foo = NewFoo()
点赞
用户2328287
用户2328287

lua_setmetatable 不会将对象从栈中移除,因此仍然存在对用户数据对象的引用。因此,Lua 不会对其进行垃圾回收。

2017-08-07 13:43:16