Lua 状态的生存周期

我正在一个微控制器环境下使用 Lua,最近遇到了一些与堆数据损坏有关的崩溃。

问题被追踪到以下序列:

  1. 调用 lua_pcall(L, 0, 0, 0),没有检查返回值。
  2. 再次调用另一个函数,这次检查 lua_pcall(L, 0, 0, 0) 的返回值。
  3. 步骤 2 失败(实际上步骤 1 已经失败了,但我没有捕捉到),并调用 lua_close(L)
  4. lua_close(L)中途,内存被释放。此时内存管理器检测到堆的损坏,系统崩溃。

我想问的是,在哪些情况下 Lua 状态是无效的(因此不允许进行任何其他操作)?

  • 调用 lua_close() 是否总是安全的?
  • 如果 lua_pcall() 失败,是否允许再次调用 lua_pcall() 并调用另一个函数?
  • 如果 lua_pcall() 失败并显示“内存不足”,是否可以对内存状态进行任何假设?在此情况下,是否可以调用 lua_close(),或者通常可以调用其他 Lua API 函数?
点赞