在Lua手册中我们读到:
引用是唯一的整数键。 只要你不手动添加 整数键进入表t,luaL_ref 确保密钥的唯一性 回报。您可以检索对象 通过调用引用r引用 lua_rawgeti(L,t,r)。功能 luaL_unref 释放引用及其 相关对象。
假设我创建了对象的引用,将其推送到API堆栈,将其保存在全局变量下,然后调用luaL_unref
....尽管在Lua中指向它,它是否会被释放?< / p>
示例代码:
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" ); // ...?
答案 0 :(得分:4)
会的。
Lua Registry只是一张桌子。这里没有魔法。
因此,您的代码大致相当于以下(lua_ref
如何使用索引除外):
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
另外,请注意您的示例没有多大意义。 (我假设它过于简单了。)在将表保存为全局变量之前,您不需要将表放入注册表。
对于要销毁的“未引用”表格,您需要使用GC进行操作。如果您在之后调用它们,则无法在 lua_newtable
和lua_setglobal
之间启用另一个没有将控制权交给Lua。在将控制权返回给Lua之前,您的表在Lua堆栈中被“引用”。
答案 1 :(得分:0)
不,它没有明确释放。
我认为问题与之前的答案之间可能存在一些混淆。 luaL_unref函数只是取消对象的对象,它实际上并不执行自由操作。因此,如果变量仍引用该对象,则它仍然存活并且不会被释放。
问题在于参考文献的措辞。关联的对象“从注册表中释放”但它没有“从内存系统中释放”。