如何清理我的Lua状态堆栈?

我正在使用lua C-API读取存储在lua文件中的配置数据。

文件中有一个不错的小表格,我编写了一个查询C函数来解析表格中的特定字段。(耶它有效了!)

它通过反复调用这些函数之一来工作:

...
lua_getglobal(...);
lua_pushinteger(...);
lua_gettable(...);
lua_pushstring(...);
lua_gettable(...);
lua_lua_getfield(...);
...

你明白的。

我完成这样查询数据后,我需要清理栈吗?

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

点赞
stackoverflow用户121674
stackoverflow用户121674

答案

这取决于情况。

如果你的 C 函数是从 Lua 中调用的,那么你留下的值将会是你的 C 函数返回给 Lua 的值。如果你的 C 函数是被另一个使用 Lua 栈的 C 函数调用的话,那么这些值仍然在栈上,你可以对其进行任何操作或什么都不用做。

但是,如果在调用 C 函数之后你完全不需要再使用 Lua,从你的问题中听起来似乎是这样的,那么你就不需要清理 Lua 栈。只需关闭 Lua 上下文,它就会为你清理栈。

2010-02-18 22:40:30
stackoverflow用户41661
stackoverflow用户41661

只要你的堆栈不会无限增长,就不会有问题。当你从 C API 返回一个整数 N 到 Lua 时,将发生两件事:

  • Lua 引擎从堆栈顶部获取 N 值,并将它们视为调用的结果。

  • Lua 引擎将清理(并重用)堆栈上的其他内容。

David Seiler 提到了可能会从其他 C 代码而不是 Lua 引擎中调用你的 C 代码的可能性。这是一种高级技术,如果你在问这个问题,你不太可能需要担心这个特定的问题。 (但在从 Lua 的角度来看,它发生的方式相同-当所有 C 代码完成执行时,它必须返回一个整数,并且 Lua 从堆栈中获取这么多个值,然后清理其余的。)

如果你使用了太多的堆栈空间,你的程序将会停止,并会显示一个合理和明智的错误信息(我有过这方面的经验)。

2010-02-19 02:34:36
stackoverflow用户282536
stackoverflow用户282536

此外,与其使用 pushstringpushinteger 后跟一个 gettable,推荐使用 lua_getfieldlua_rawgeti(有关 raw 的使用不会调用元方法,如果您需要的话...)

2010-02-27 04:50:58