【问题标题】:Lua stack cleaning (C API)Lua 堆栈清理(C API)
【发布时间】:2011-02-08 16:38:05
【问题描述】:

通常,在我定义的函数运行后,我会留下最多 6 个剩余条目的 Lua 堆栈。

在某些情况下,这会导致严重的内存泄漏/堆栈溢出!我在函数结束时使用 lua_settop( L, 0 ) 解决了它们。

在其他情况下,即使在我的函数结束时堆栈不是空的,也没有泄漏。

  • 什么时候需要清理 Lua 堆栈?
  • 堆栈中的某一时刻怎么会包含大约 10.000 个元素? (函数中根本没有使用循环)

【问题讨论】:

    标签: lua


    【解决方案1】:

    当退出用 C 语言编写的 Lua 函数时,您不需要清理 Lua 堆栈,当然,前提是该函数是从 Lua 调用的。如果您遇到内存泄漏,请发布一个显示问题的最小示例。如果堆栈有 10000 个条目,请确保您已调用 lua_checkstackluaL_checkstack

    【讨论】:

      【解决方案2】:
      void lua_pop (lua_State *L, int n);
      /*Pops n elements from the stack.*/
      

      至于为什么 - 不能说清楚 - 有很多可能的原因,你能发布一些导致这种情况的代码示例吗?以下是一些常见的(恕我直言)原因。

      Lua 不会导致任何内存泄漏,除非您使用轻量级用户数据(唯一不受垃圾收集器管理的用户数据)。

      你有没有 malloc 任何东西而不是使用 lua_newuserdata?

      您是否在函数开始时检查过堆栈大小?也许你刚刚从 Lua 传递了那么多参数(例如调用 c_func(unpack(huge_table)); )?

      【讨论】:

      • 我假设你遇到问题的代码是从 Lua 调用的 - 如果它只是 c 调用 Lua 脚本 lua_pop 就足够了。
      猜你喜欢
      • 1970-01-01
      • 2011-09-24
      • 2013-03-03
      • 2012-08-06
      • 1970-01-01
      • 2013-10-03
      • 1970-01-01
      • 2023-03-04
      • 1970-01-01
      相关资源
      最近更新 更多