lua_unref在lua中使用的对象上
在Lua手册中,我们看到: 引用是唯一的整数键。 只要您不手动添加 表t中的整数键,luaL\u ref 确保密钥的唯一性 返回。您可以检索一个对象 通过调用引用r引用 卢阿乌·拉盖蒂(左、右、右)。作用 luaL_unref释放参考及其 关联对象 假设我创建一个对象的引用,将其推送到API堆栈上,保存在一个全局变量下,然后调用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,
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