2010-02-18 65 views
5

我正在使用lua C-API读取存储在lua文件中的配置数据。我该如何清理我的lua状态堆栈?

我在文件中有一个很好的小表,我写了一个查询C函数来解析表中的特定字段。 (耶它的作品!)

它可以通过调用其中的一些种功能的一遍又一遍:

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

你的想法。

在完成查询我的数据之后,我是否必须清理堆栈?

回答

6

只要你的堆栈不增长没有界限,你会没事的。当您从C API返回整数ň到Lua中,发生两件事情:

  • 的Lua的引擎从堆栈采用顶部ñ值,并认为它们作为调用的结果。

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

David Seiler提到了你的C代码被其他C代码调用而不是来自Lua引擎的可能性。这是一种先进的技术,如果你问这个问题,你不可能担心这个问题。 (但是,从Lua的角度发生的方式相同—时所有 C代码执行完毕,它返回一个整数,和Lua果皮是从堆栈许多值,然后重新分配剩下的。)

如果你使用了太多的堆栈槽,你的程序将会停止,并带有明智的错误信息(正如我从经验中所知道的那样)。

1

这取决于。

如果您的C函数是从Lua调用的,则您留下的值将是您的C函数返回给Lua的值。如果你的C函数被另一个使用Lua栈的C函数调用,那么这些值将仍然在堆栈上,你可以对它们做任何事情或不做任何事情。

但是,如果在调用C函数后完全使用了Lua,并且从您的问题中听起来好像您是这样,那么您不必清理Lua堆栈。只需关闭Lua环境,它就会为你清理你的堆栈。

1

另外,而是采用pushstring或pushinteger后跟一个gettable,使用lua_getfieldlua_rawgeti respectivly(原不会调用元方法虽然,柜面你想那...)