我使用lua C-API读取存储在lua文件中的配置数据。
我在文件中有一个漂亮的小表,我编写了一个查询C函数来解析表中的特定字段。 (它的确有效!)
它通过一遍又一遍地调用这些功能中的一些来起作用:
...
lua_getglobal (...);
lua_pushinteger (...);
lua_gettable (...);
lua_pushstring (...);
lua_gettable (...);
lua_lua_getfield (...);
...
你明白了。
在我查询完这样的数据之后,我是否需要清理堆栈?
答案 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_getfield
和lua_rawgeti
(raw不会调用metamethods,但是你想要那个......)