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

tolua++: Transfer pointer ownership to lua gc

有没有办法将堆上分配的 return 个对象分配到 lua 而无需 'caching' 对它们的引用?

考虑以下几点:

class foo
{
    char const* bar() const
    {
        char* s = malloc(...);
        ...
        return s; // << Leak. How to transfer the ownership of 's' to lua?
    }
};

如果我 return 分配内存的字符串我必须删除它。 有没有办法将所有权转让给 lua?

或者是否有可能让 lua_state* 自己使用 lua_pushstring(...) 实现字符串 returning?

您可以使用 lua_pushstring 函数将您的字符串传递到 Lua,然后释放它:

Pushes the zero-terminated string pointed to by s onto the stack. Lua makes (or reuses) an internal copy of the given string, so the memory at s can be freed or reused immediately after the function returns. The string cannot contain embedded zeros; it is assumed to end at the first zero.

如果您确实希望转让所有权,请考虑将您的字符串包装到适当的 object 中,并使用其自己的元表并实现 __gc 函数。

通过声明参数 'lua_Sate* state' 到 lua++ 会将 Lua-State 传递给函数。

使用 return 类型的 'lua_Object' 类型,您可以 return 堆栈索引到 lua 对象。

打包

lua_Object MyFunctionReturningATable(lua_State* s);

CPP

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

    ...

    return lua_gettop();
}