Ver*_*lka 7 c lua garbage-collection object lua-table
我的主机C应用程序,嵌入Lua解释器,需要通知运行Lua脚本中的某些对象/表是垃圾收集,所以它会做一些事情,比如将此事件记录到日志文件.我怎样才能做到这一点?
Neo*_*ium 12
通过向userdata添加metatable并向metatable添加"__gc"函数.
在Lua 5.1中,只有userdata支持"__gc"methamethod.
检测Lua表的垃圾收集的一种方法是将canary userdata对象添加到该表中:
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
Run Code Online (Sandbox Code Playgroud)
用于创建和添加metatable到用户数据对象的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. */
}
Run Code Online (Sandbox Code Playgroud)