tolua++:将指针所有权转移给Lua的垃圾回收器

有没有一种方法可以在不“缓存”它们的情况下将在堆上分配的对象返回给 Lua?

考虑以下内容:

class foo
{
    char const* bar() const
    {
        char* s = malloc(...);
        ...
        return s; // << 泄漏。 如何将's'的所有权传递给Lua?
    }
};

如果我返回一个分配的内存字符串,我必须删除它。 有没有一种方法可以将所有权转移给 Lua?

或者说,我能否使用lua_pushstring(...)获取lua_state*以便自己实现字符串返回?

点赞
用户4328606
用户4328606

你可以使用 lua_pushstring 函数将你的字符串传递到 Lua 中,然后在使用完后将其释放:

把由 s 指向的以零结尾的字符串压入栈中。Lua 会制作(或重用)给定字符串的内部副本,所以在函数返回后,可以立即释放或重新使用 s 的内存。字符串不能包含嵌入的零;它被认为在第一个零时结束。

如果你真的想要转移所有权,可以考虑将你的字符串包装成适当的 对象,并实现 __gc 函数。

2016-01-11 15:56:00
用户88888888
用户88888888

通过声明参数'lua_State* state',tolua++将把Lua状态传递给函数。

通过类型为“lua_Object”的返回类型,您可以返回到一个Lua对象的堆栈索引。

PKG

lua_Object MyFunctionReturningATable(lua_State* s);

CPP

lua_Object MyFunctionReturningATable(lua_State* s)
{
    lua_newtable(s);

    ...

    return lua_gettop();
}
2016-04-05 13:30:15