我正在开发一个使用Kahlua嵌入式Lua脚本的Java应用程序。在调用了很多函数之后,它总是会崩溃,出现堆栈溢出......我需要做些什么来从栈中删除未使用的调用帧?Lua堆栈溢出
Q
Lua堆栈溢出
1
A
回答
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
您必须确保您退出每个方法调用。例如:
...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(){
....
}
这样,所有的呼叫返回到基准水平。
0
尝试使用尾调用,你可以,他们不占用一个栈槽:
function foo ()
return bar()
end
2
如果您正确使用Kahlua框架,则从函数返回时应该自动清理堆栈。如果不是这样,你已经发现了一个错误,我非常想要一个错误报告:)
最好的(接近)最小的测试用例会暴露出问题。
相关问题
- 1. 堆栈溢出
- 2. .NET堆栈溢出?
- 3. Threading.Timer堆栈溢出
- 4. 堆栈溢出C++
- 5. C#堆栈溢出
- 6. MPMoviePlayerController堆栈溢出
- 7. C++堆栈溢出
- 8. Malloc堆栈溢出
- 9. 堆栈搜索导致堆栈溢出
- 10. 序言集,堆栈溢出
- 11. 堆栈溢出(Shellcoder手册)
- 12. 堆栈溢出错误?
- 13. ArrayLists堆栈溢出错误
- 14. 足够堆栈溢出?
- 15. Lisp堆栈溢出绑定
- 16. 堆栈溢出从railstutorial.org
- 17. 堆栈溢出错误
- 18. Quicksort引起堆栈溢出?
- 19. 堆栈溢出(关于“evhttp_uri_parse”)
- 20. 堆栈溢出异常
- 21. 堆栈溢出中的SAML?
- 22. GWT:堆栈溢出在IE
- 23. 堆栈溢出错误
- 24. Jboss中的堆栈溢出
- 25. 堆栈溢出Web架构
- 26. 堆栈溢出/ SEG故障
- 27. JWS堆栈溢出错误
- 28. 阵列堆栈溢出
- 29. 编译器堆栈溢出
- 30. 堆栈溢出异常
请提供更多信息,我们无法回答。 – orlp 2011-01-10 23:12:24
我很抱歉,您无法理解。我正在使用我自己的事件系统;脚本可以使用link()全局函数来添加一个钩子。当需要调用事件时,程序会遍历所有链接到它的Lua函数,并使用适当的参数调用它们。但是,在调用太多事件之后,Lua库(不是Java)抱怨堆栈溢出。 – phpscriptcoder 2011-01-11 00:10:31
为什么这个问题标签luaj如果它是关于卡鲁阿? – PhiLho 2012-10-23 11:42:36