LUA C API - 使用luaL_ref实现弱引用。

在以下示例中:

int r = luaL_ref(L, LUA_REGISTRYINDEX);

r 将是堆栈顶部对象的强引用。

是否可以获得对堆栈顶部对象的弱引用?

我考虑过的其中一种方法是创建一个具有弱值的表并将其存储在全局注册表中。因此,在需要弱值时使用它。

是否存在更简单的方法?

Lua 2.4 在文档中有这个功能,但是 luaL_ref 现在似乎工作方式不同。:

函数 lua_ref 创建对堆栈顶部对象的引用,并返回此引用。如果 lock 是 true,则对象被锁定:即对象将不会被垃圾回收。

点赞
用户965619
用户965619

这是我想出的解决方案:

int create_ref(bool weak_ref)
{
    lua_newtable(L); //新建一个表new_table={}

    if (weak_ref) {
        lua_newtable(L); //新建一个元表metatable={}

        lua_pushliteral(L, "__mode");
        lua_pushliteral(L, "v");
        lua_rawset(L, -3); //在metatable中增加一个键__mode,值为'v',即metatable._mode='v'

        lua_setmetatable(L, -2); //将new_table的元表设置为metatable,即setmetatable(new_table,metatable)
    }

    lua_pushvalue(L,-2); //将栈顶前面的一个值(即表new_table)推入栈顶
    lua_rawseti(L,-2,1); //将原栈顶的值作为new_table的第一个元素存储,即new_table[1]=原栈顶的值

    //现在new_table在栈顶,剩下的操作由用户自行处理
    //以下是如何存储引用的示例:
    return luaL_ref(L, LUA_REGISTRYINDEX); //这个函数会将new_table从栈顶弹出
}

使用这个函数,我可以存储弱引用和强引用。只需增加一个表作为开销(或者一个表和一个元表用于弱引用)。

2013-10-13 01:18:03