我正在开发一个使用Kahlua进行嵌入式Lua脚本编写的Java应用程序。在调用了很多函数之后,它总是会因堆栈溢出而崩溃...我是否需要做些什么来从堆栈中删除未使用的调用帧?
答案 0 :(得分:2)
在标准Lua中,您可以使用lua_pop
函数从Lua堆栈中删除项目。有关此用法的提示,请参阅this answer。
如果您反复调用代码,最简单的方法是在处理之前存储堆栈的高度,然后将其恢复:
int top = lua_gettop(L);
... /* some processing involving the stack*/
lua_settop(L, top);
现在,我不知道如何在Kahlua实现这一目标。但在源代码中,我看到LuaCallFrame.getTop()
和LuaCallFrame.setTop()
,因此代码应该类似。
答案 1 :(得分:2)
如果您正确使用Kahlua框架,则从函数返回时应自动清理堆栈。如果不是这样,你发现了一个错误,我非常想要一个错误报告:)
最好的(接近)最小的测试用例会暴露问题。
答案 2 :(得分:1)
您必须确保退出每个方法调用。例如:
...main(...){
displayMenu();
}
void displayMenu(){
System.out.println("1.Do A. \n2.Do B");
int q = readInt;
if (q==1){
doA();
}else{
doB();
}
}
void doA(){
.....
displayMenu()
}
void doB(){
....
displayMenu();
}
使堆栈不被炸毁的方法是做这样的事情:
...main(...){
while(true){displayMenu()};
}
void displayMenu(){
System.out.println("1.Do A. \n2.Do B");
int q = readInt;
if (q==1){
doA();
}else{
doB();
}
}
void doA(){
.....
}
void doB(){
....
}
这样所有的调用都会返回基级。
答案 3 :(得分:0)
尽可能尝试使用尾调用,它们不占用堆栈槽:
function foo ( )
return bar()
end