我正在开发一个使用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. 堆栈溢出
- 3. 堆栈溢出C++
- 4. C#堆栈溢出
- 5. Malloc堆栈溢出
- 6. 堆栈溢出C++
- 7. LINQ2SQL堆栈溢出
- 8. 堆栈溢出ToArray()
- 9. C++堆栈溢出
- 10. 堆栈溢出:: regex_replace
- 11. .NET堆栈溢出?
- 12. MPMoviePlayerController堆栈溢出
- 13. ViewDragHelper堆栈溢出
- 14. GinMapProvider堆栈溢出
- 15. Threading.Timer堆栈溢出
- 16. 堆栈溢出调用堆栈#timememoryfunctionlocation 10.0000143728
- 17. 堆栈搜索导致堆栈溢出
- 18. java.util.Properties.getProperty的堆栈溢出
- 19. freertos中的堆栈溢出
- 20. OpenID像堆栈溢出
- 21. 堆栈溢出(关于“evhttp_uri_parse”)
- 22. 堆栈缓冲区溢出
- 23. QuickSort能否堆栈溢出?
- 24. compareTo导致堆栈溢出
- 25. “ERR:SEH:setup_exception堆栈溢出” 在MSVC
- 26. 尾递归:堆栈溢出
- 27. 阵列堆栈溢出
- 28. 堆栈溢出的原因
- 29. 堆栈溢出技术
- 30. Lisp堆栈溢出绑定
请提供更多信息,我们无法回答。 – 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