lua_unref在lua中使用的对象上

lua_unref在lua中使用的对象上,lua,Lua,在Lua手册中,我们看到: 引用是唯一的整数键。 只要您不手动添加 表t中的整数键,luaL\u ref 确保密钥的唯一性 返回。您可以检索一个对象 通过调用引用r引用 卢阿乌·拉盖蒂(左、右、右)。作用 luaL_unref释放参考及其 关联对象 假设我创建一个对象的引用,将其推送到API堆栈上,保存在一个全局变量下,然后调用luaL\u unref。。。。尽管在Lua被指向,它还是被释放了吗 示例代码: lua_newtable( L ); int index = luaL_ref( L,

在Lua手册中,我们看到:

引用是唯一的整数键。 只要您不手动添加 表t中的整数键,luaL\u ref 确保密钥的唯一性 返回。您可以检索一个对象 通过调用引用r引用 卢阿乌·拉盖蒂(左、右、右)。作用 luaL_unref释放参考及其 关联对象

假设我创建一个对象的引用,将其推送到API堆栈上,保存在一个全局变量下,然后调用
luaL\u unref
。。。。尽管在Lua被指向,它还是被释放了吗

示例代码:

lua_newtable( L );
int index = luaL_ref( L, LUA_REGISTRYINDEX );
lua_rawgeti( L, LUA_REGISTRYINDEX, index );
lua_setglobal( L, "test" );
luaL_unref( L, LUA_REGISTRYINDEX, index );   
lua_getglobal( L, "test" ); // ...?
是的

Lua注册表仅仅是一个表。这里没有魔法

因此,您的代码大致相当于以下内容(除了
lua\u ref
如何使用索引):

另外,请注意,您的示例没有多大意义。(我假设它过于简单了。)在将表保存为全局变量之前,不需要将其放入注册表

要销毁“未引用”表,您需要GC介入。如果您在不将控制权返回到lua-in-between的情况下逐个调用它们,则它无法在
lua\u newtable
lua\u setglobal
之间启动。在您将控制权返回到Lua之前,您的表将在Lua堆栈中被“引用”。

Lua注册表仅仅是一个表。这里没有魔法

因此,您的代码大致相当于以下内容(除了
lua\u ref
如何使用索引):

另外,请注意,您的示例没有多大意义。(我假设它过于简单了。)在将表保存为全局变量之前,不需要将其放入注册表


要销毁“未引用”表,您需要GC介入。如果您在不将控制权返回到lua-in-between的情况下逐个调用它们,则它无法在
lua\u newtable
lua\u setglobal
之间启动。在将控制权返回到Lua之前,您的表将在Lua堆栈中被“引用”。

否,它不会被显式释放

我认为这个问题和前面的答案可能有些混淆。 luaL_unref函数只是取消引用对象,实际上并不执行自由操作。因此,如果变量仍然引用对象,它将保持活动状态,并且不会被释放


问题在于参考书的措辞。关联对象已“从注册表中释放”,但未“从内存系统中释放”。

否,未显式释放

我认为这个问题和前面的答案可能有些混淆。 luaL_unref函数只是取消引用对象,实际上并不执行自由操作。因此,如果变量仍然引用对象,它将保持活动状态,并且不会被释放

问题在于参考书的措辞。关联对象是“从注册表中释放”的,但不是“从内存系统中释放”

local t = { }
local index = #_R + 1 -- Assume that fictional _R is registry
_R[index] = t
_G["test"] = t -- Non-fictional _G is a global environment
_R[index] = nil