LUA C API - luaL_ref中的弱引用

3
以下是示例:

举个例子:

int r = luaL_ref(L, LUA_REGISTRYINDEX);

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

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

我考虑的方法之一是创建一个带有弱值的表,并将其存储在全局注册表中。然后在需要弱值时使用它。

是否有更简单的方法?

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

函数lua_ref创建对位于堆栈顶部的对象的引用,并返回此引用。如果lock为true,则锁定该对象:这意味着对象将不会被垃圾回收


可能是寻找“弱Lua注册表”的重复问题。 - Kamiccolo
@Kamiccolo 这个问题特别涉及到 luaL_ref。我正在寻找一个 C API 的解决方案来实现它。 - Grapes
1个回答

1
这是我想出的解决方案:
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'

        lua_setmetatable(L, -2); // setmetatable(new_table,metatable)
    }

    lua_pushvalue(L,-2); // push the previous top of stack
    lua_rawseti(L,-2,1); // new_table[1]=original value on top of the stack

    //Now new_table is on top of the stack, rest is up to you
    //Here is how you would store the reference:
    return luaL_ref(L, LUA_REGISTRYINDEX); // this pops the new_table
}

使用此函数,我可以存储弱引用和强引用。只需增加1个额外的表作为开销(或1个元表用于弱引用)。


是的,这是唯一真正的方法,除了与userdata值绑定的uservalues也是弱引用。但是这种方法特定于使用userdata对象,可能不适用于您的情况。 - Ian

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接