什么时候允许在 C++ 中调用 lua_gc 同时使用 lua_newuserdata
When is it allowed to call lua_gc in C++ when also using lua_newuserdata
下面的例子只是为了演示 problem/question;实际上我有创建功能
returning 许多不同的用户数据对象,在其中一些之间我可能想调用 Lua 垃圾收集器。
此外,我在 Windows 和 Linux 上都使用 Lua 版本 5.3.3,运行。为简单起见,未显示错误处理。
我有一个 C++ class 通过标准用户数据暴露给 Lua,如"Programming in Lua" 作者:Roberto Ierusalimschy。
我的问题是我不确定 Lua 何时确实引用了我的对象,所以我什么时候可以调用
通过 C++ lua_gc 函数的垃圾收集器?
我有带有构造函数和析构函数的标准 Foo C++ class。并定义了一个元表 "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) 的 return 之后建立引用,但我可以调用垃圾收集器,如图所示?):
LUA> foo = NewFoo()
lua_setmetatable
不会从堆栈中删除对象,因此存在对您的用户数据对象的引用。所以Lua就不收了
下面的例子只是为了演示 problem/question;实际上我有创建功能 returning 许多不同的用户数据对象,在其中一些之间我可能想调用 Lua 垃圾收集器。
此外,我在 Windows 和 Linux 上都使用 Lua 版本 5.3.3,运行。为简单起见,未显示错误处理。
我有一个 C++ class 通过标准用户数据暴露给 Lua,如"Programming in Lua" 作者:Roberto Ierusalimschy。 我的问题是我不确定 Lua 何时确实引用了我的对象,所以我什么时候可以调用 通过 C++ lua_gc 函数的垃圾收集器?
我有带有构造函数和析构函数的标准 Foo C++ class。并定义了一个元表 "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) 的 return 之后建立引用,但我可以调用垃圾收集器,如图所示?):
LUA> foo = NewFoo()
lua_setmetatable
不会从堆栈中删除对象,因此存在对您的用户数据对象的引用。所以Lua就不收了