Lua堆栈清理(C API)

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

在某些情况下,这会导致严重的内存泄漏/堆栈溢出!我通过在函数末尾使用lua_settop (L,0) 解决这些问题。

在其他情况下,即使堆栈在函数末尾不为空,也不会发生内存泄漏。

  • 我必须何时清理Lua stack?
  • 如何可能出现堆栈中有约10,000个元素的情况?(函数中未使用任何循环)

原文链接 https://stackoverflow.com/questions/4935678

点赞
stackoverflow用户107090
stackoverflow用户107090

你不需要清理 Lua 栈当退出一个用 C 写的 Lua 函数,当然前提是这个函数是从 Lua 中调用的。如果你遇到了内存泄漏,请发布一个最小的能够展示问题的例子。如果栈中有 10000 个条目,请确保你已经调用了 lua_checkstackluaL_checkstack

2011-02-08 17:09:43
stackoverflow用户459706
stackoverflow用户459706
void lua_pop (lua_State *L, int n);
/*从堆栈中弹出 n 个元素。*/

关于为什么会出现内存泄漏 - 我不太清楚 - 可能有许多原因,您能发布一些引起此问题的代码示例吗?以下是几个常见的(依我看来)原因。

除了轻量级用户数据(唯一不受垃圾回收器管理的用户数据)之外,Lua 不应导致任何内存泄漏。

您有没有使用 lua_newuserdata,而是使用 malloc 进行了任何操作?

在函数开始处,您有检查堆栈大小吗?也许您只是从 Lua 传递了这么多参数(例如调用 c_func(unpack(huge_table));)?

2011-02-09 15:51:20