【问题标题】:Lifetime of Lua object "globally returned" to CLua 对象的生命周期“全局返回”到 C
【发布时间】:2018-07-18 15:50:37
【问题描述】:

所以我有一个非常简单的 Lua 脚本,如下所示:

return coroutine.create(function () coroutine.yield(1) end)

然后在 C 中运行它并获取返回值

lua_State* l = luaL_newstate();
if(luaL_dostring(l, script) == LUA_OK) {
  lua_State* co = lua_tothread(l, lua_gettop(l));
  lua_pop(l, 1);
}

稍后,C 代码会将co 指针传回Lua(使用lua_pushthread)并运行coroutine.resume(co)

我想知道 Lua 是否会在此期间 GC 协程对象,导致 C 中的 co 指针无效?如果是,我能做些什么来防止这种情况发生?

【问题讨论】:

  • 您应该将此值保存在注册表中以防止 GC 吃掉它。 See also

标签: c lua lua-api


【解决方案1】:

稍加注意,您可以将协程留在堆栈中。只需删除对lua_pop 的调用即可。

【讨论】:

  • 但后来我无法从堆栈中清除它?因为我会忘记那个特定协程值的堆栈位置?
猜你喜欢
  • 2013-09-25
  • 2013-04-18
  • 1970-01-01
  • 2011-04-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-07
相关资源
最近更新 更多