gpt4 book ai didi

c - 当对象/表被垃圾回收时如何通知主机应用程序

转载 作者:太空狗 更新时间:2023-10-29 17:07:57 25 4
gpt4 key购买 nike

我的主机 C 应用程序,嵌入了一个 Lua 解释器,需要通知运行 Lua 脚本的某些对象/表被垃圾收集,所以它会做一些事情,比如记录这个事件到日志文件。我该怎么做?

最佳答案

通过向用户数据添加元表并向元表添加“__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. */
}

关于c - 当对象/表被垃圾回收时如何通知主机应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4090586/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com