何时允许在使用lua_newuserdata时在C ++中调用lua_gc

时间:2017-08-07 12:40:30

标签: c++ lua lua-userdata

以下示例仅用于演示问题/问题;实际上我有功能创造 并返回许多不同的userdata对象,其中一些我可能想要调用Lua垃圾收集器。

另外,我使用的是Lua版本5.3.3,在Windows和Linux上运行。为简单起见,未显示错误处理。

我有一个C ++类通过标准用户数据暴露给Lua,如例如" Lua编程"作者:Roberto Ierusalimschy。 我的问题是我不确定Lua什么时候对我的对象有引用,所以什么时候我可以调用它 垃圾收集器通过C ++ lua_gc函数?

我有例如带有构造函数和析构函数的标准Foo C ++类。并定义了一个metatable" FOO" 使用名为ReleaseFoo的__gc入口函数,如图所示。

我通过以下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);

  // QUESTION: Can I call lua_gc(L, LUA_GCCOLLECT, 0) here without
  //           risking my user data object being garbage collected.
  //           As I see it, Lua does not yet have a reference
  //           to my user data object.

  return 1;
}

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

在Lua中,使用它看起来像(因此只有在返回C ++函数NewFoo(L)之后才建立引用,但是我可以调用垃圾收集器,如图所示吗?):

LUA> foo = NewFoo()

1 个答案:

答案 0 :(得分:3)

Stack<T> :: Stack() { queue = Queue<T>(); } 不会从堆栈中删除对象,因此存在对userdata对象的引用。所以Lua不会收集它。