2010-11-03 37 views

回答

12

通過向用戶數據添加metatable並向metatable添加「__gc」函數。

In Lua 5.1, only userdata has support for the "__gc" methamethod.

一個檢測Lua中的表的垃圾收集的方法是添加一個金絲雀用戶數據對象到該表中:

function create_canary(tab) 
    local canary=newproxy(true) 
    local meta=getmetatable(canary) 
    meta.__gc = function() print("Canary is died:", tab) end 
    tab[canary] = canary 
end 

C代碼創建和一個元表添加到用戶數據對象:

static int userdata_gc_method(lua_State *L) { 
    UserObj *ud = lua_touserdata(L, 1); 
    /* TODO: do something */ 
    return 0; 
} 
static int create_userdata_obj(lua_State *L) { 
    UserObj *ud = lua_newuserdata(L, sizeof(UserObj)); 
    /* TODO: initialize your userdata object here. */ 

    lua_newtable(L); /* create metatable. */ 
    lua_pushliteral(L, "__gc"); /* push key '__gc' */ 
    lua_pushcfunction(L, userdata_gc_method); /* push gc method. */ 
    lua_rawset(L, -3); /* metatable['__gc'] = userdata_gc_method */ 
    lua_setmetatable(L, -2); /* set the userdata's metatable. */ 
    return 1; /* returning only the userdata object. */ 
} 
+0

這就是目前使用的解決方案。認爲有更好的一個。順便說一句,這是什麼新的代理(真)? – Vertilka 2010-11-04 18:07:56

+0

newproxy(true) - 創建一個userdata對象(size = 0)和一個metatable。這是Lua未記錄的功能。你可以在這裏閱讀更多關於它的信息:http://lua-users.org/wiki/HiddenFeatures – Neopallium 2010-11-05 01:19:57