lua_unref用于Lua中使用的对象

时间:2011-01-20 23:12:31

标签: lua

在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" ); // ...?

2 个答案:

答案 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_newtablelua_setglobal之间启用另一个没有将控制权交给Lua。在将控制权返回给Lua之前,您的表在Lua堆栈中被“引用”。

答案 1 :(得分:0)

不,它没有明确释放。

我认为问题与之前的答案之间可能存在一些混淆。 luaL_unref函数只是取消对象的对象,它实际上并不执行自由操作。因此,如果变量仍引用该对象,则它仍然存活并且不会被释放。

问题在于参考文献的措辞。关联的对象“从注册表中释放”但它没有“从内存系统中释放”。