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_state*我自己使用实现字符串返回lua_pushstring(...)

4

2 回答 2

2

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

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

如果您真的希望转移所有权,请考虑将您的字符串包装到具有自己的元表和实现函数的适当对象中。__gc

于 2016-01-11T15:56:00.477 回答
0

通过声明一个参数 'lua_Sate* state',tolua++ 会将 Lua-State 传递给函数。

使用“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-05T13:30:15.050 回答