tolua++:将指针所有权转移给lua gc

3
有没有一种方法可以在不“缓存”它们的情况下将在堆上分配的对象返回给Lua?
考虑以下代码:
class foo
{
    char const* bar() const
    {
        char* s = malloc(...);
        ...
        return s; // << Leak. How to transfer the ownership of 's' to lua?
    }
};

如果我返回一个分配的内存字符串,我必须删除它。有没有一种方法可以将所有权转移给lua?
或者,是否有可能使用lua_pushstring(...)自己实现字符串返回并获取lua_state*?
2个回答

2
您可以使用 lua_pushstring 函数将字符串传递给 Lua,并在之后释放它:

将s指向的以零结尾的字符串推入栈中。Lua 会创建(或重用)给定字符串的内部副本,因此在函数返回后,s 的内存可以被释放或立即重用。该字符串不能包含嵌入的零;它被假定为在第一个零处结束。

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


push_string 的问题在于我在 C++ 函数中无法访问 lua_state - user3647854

0
通过声明参数“lua_State * state”,tolua ++将Lua-State传递给函数。
通过类型为“lua_Object”的返回类型,您可以返回lua对象的堆栈索引。
PKG
lua_Object MyFunctionReturningATable(lua_State* s);

C++

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

    ...

    return lua_gettop();
}

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