C++ 如何清理lua状态堆栈?

C++ 如何清理lua状态堆栈?,c++,c,lua,C++,C,Lua,我正在使用LUAC-API读取存储在lua文件中的配置数据 我在文件中有一个很好的小表,我编写了一个查询C函数,它解析出表中的一个特定字段。(哎呀,它真管用!) 它通过反复调用以下几种函数来工作: ... lua_getglobal (...); lua_pushinteger (...); lua_gettable (...); lua_pushstring (...); lua_gettable (...); lua_lua_getfield (...); ... 你明白了 像

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

我在文件中有一个很好的小表,我编写了一个查询C函数,它解析出表中的一个特定字段。(哎呀,它真管用!)

它通过反复调用以下几种函数来工作:

... 
lua_getglobal (...); 
lua_pushinteger (...); 
lua_gettable (...); 
lua_pushstring (...); 
lua_gettable (...); 
lua_lua_getfield (...);
...
你明白了

像这样查询完数据后,是否需要清理堆栈?

这取决于具体情况

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


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

只要您的堆栈没有无限制地增长,您就可以了。当您将整数N从C API返回到Lua时,会发生两件事:

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

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

David Seiler提到了从其他C代码而不是Lua引擎调用您的C代码的可能性。这是一种先进的技术,如果你问这个问题,你就不必担心这个问题。(但从Lua的角度来看,当所有C代码执行完毕时,它必须返回一个整数,Lua从堆栈中剥离那么多值,然后释放其余值,情况是一样的。)


如果使用太多堆栈插槽,程序将停止运行,并显示一条合理的错误消息(我从经验中知道)。

此外,不要使用pushstring或pushinteger后跟一个gettable,请分别使用
lua\u getfield
lua\u rawgeti
(不过,如果您需要,raw不会调用元方法…)