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

时间:2010-02-18 21:23:38

标签: c++ c lua

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

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

它通过一遍又一遍地调用这些功能中的一些来起作用:

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

你明白了。

在我查询完这样的数据之后,我是否需要清理堆栈?

3 个答案:

答案 0 :(得分:6)

只要您的筹码不会无限制地增长,您就没事了。当您将C ++中的整数 N 返回到Lua时,会发生两件事:

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

  • Lua引擎释放(并重用)堆栈中的其他所有内容。

David Seiler提到了从其他C代码而不是从Lua引擎调用C代码的可能性。这是一种先进的技术,如果您提出这个问题,您不必担心该特定问题。 (但是从Lua的角度看它发生的方式是一样的 - 当所有 C代码完成执行时,它必须返回一个整数,并且Lua从堆栈中剥离了许多值,然后释放其余的值。 )

如果您使用太多的堆栈插槽,您的程序将会停止并提供理智且明智的错误消息(据我所知)。

答案 1 :(得分:1)

取决于。

如果从Lua调用C函数,则留下的值将是C函数返回Lua的值。如果您的C函数被另一个使用Lua堆栈的C函数调用,那么这些值仍将在堆栈中,您可以对它们执行任何操作。

但是,如果在你调用了你的C函数后,你完全已经完成了Lua,并且从你的问题听起来好像你是,那么你就不必清理你的Lua堆栈了。只需关闭Lua上下文,它就会为你清理堆栈。

答案 2 :(得分:1)

另外,不是使用pushstring或pushinteger后跟gettable,而是分别使用lua_getfieldlua_rawgeti(raw不会调用metamethods,但是你想要那个......)