Lua堆栈清理(C API)

时间:2011-02-08 16:38:05

标签: lua

通常情况下,在我定义的函数运行后,我将最多6个剩余条目留给Lua stacky杂乱。

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

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

  • 我什么时候需要清理Lua堆栈?
  • 如果堆栈中的某个点上有大约10.000个元素,怎么可能呢? (函数中根本没有使用循环)

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:0)

void lua_pop (lua_State *L, int n);
/*Pops n elements from the stack.*/

至于为什么 - 真的不能告诉 - 有很多可能的原因,你能发布一些引起这种情况的代码示例吗?以下几个常见的(imho)原因。

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

你有没有使用lua_newuserdata而不是使用loc_newuserdata?

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