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

时间:2016-01-11 10:23:59

标签: c++ lua lua-api tolua++

有没有办法将堆上分配的对象返回给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(...)实现自己返回的字符串吗?

2 个答案:

答案 0 :(得分:2)

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

  

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

如果您真的希望转让所有权,请考虑将您的字符串包装到具有自己的metatable并实现__gc函数的相应object中。

答案 1 :(得分:0)

通过声明参数&lt; lua_Sate * state&#39; tolua ++会将Lua-State传递给函数。

返回类型为&#39; lua_Object&#39;你可以将stack-index返回给lua对象。

PKG

lua_Object MyFunctionReturningATable(lua_State* s);

CPP

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

    ...

    return lua_gettop();
}