[英]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_getfield
, lua_rawgeti
分别使用lua_getfield
和lua_rawgeti
(raw不会调用metamethods,但是你想要那个...)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.