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