繁体   English   中英

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

[英]how do I clean up my lua state stack?

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

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

它通过一遍又一遍地调用这些函数中的一些来工作:

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

你明白了。

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

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

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

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

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

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

这取决于。

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM