2011-01-20 28 views
1

被使用在lua的手冊中,我們讀:lua_unref在Lua

的引用是一個唯一整數密鑰。 只要您不手動將 整數鍵添加到表t中,luaL_ref 可確保其返回的密鑰的唯一性。您可以通過調用 lua_rawgeti(L,t,r)檢索參考文獻r提到的對象 。功能 luaL_unref 釋放參考及其 關聯對象

假設我創建一個對象的引用,將其推到API堆棧,保存一個全局變量下,然後調用luaL_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"); // ...? 

回答

3

這將是。

Lua註冊表僅僅是一個表格。這裏沒有魔法。

所以,你的代碼是大致相當於以下(含如何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棧中被「引用」。

0

不,它沒有明確釋放。

我認爲這個問題和以前的答案可能存在一些混淆。 luaL_unref函數只是不重視對象,它實際上並不執行自由操作。所以如果一個變量仍然引用該對象,它仍然是活着的,並且不會被釋放。

問題在於引用的措詞。關聯的對象「從註冊表中釋放」,但不是「從內存系統中釋放」。