Lua堆栈溢出

我正在开发一个使用嵌入式 Lua 脚本的 Java 应用程序,使用 Kahlua。在调用大量函数后,它总是出现堆栈溢出的情况... 我需要做些什么来从堆栈中删除未使用的调用帧吗?

原文链接 https://stackoverflow.com/questions/4652522

点赞
stackoverflow用户555122
stackoverflow用户555122

你必须确保每个方法调用都有返回。例如:

...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(){
  ....
}

这样所有的调用都会返回到基本级别。

2011-01-10 23:31:37
stackoverflow用户282536
stackoverflow用户282536

尽可能使用尾递归,它们不会占用堆栈空间:

function foo ( )
    return bar()
end
2011-01-11 00:58:51
stackoverflow用户221509
stackoverflow用户221509

在标准的 Lua 中,你可以使用 lua_pop 函数来从 Lua 栈中移除元素。请参考 这个回答 ,以获取这个函数的使用提示。

如果你正在重复调用你的代码,最简单的方法是在处理前存储栈的高度,并在处理后恢复它:

int top = lua_gettop(L);
... /* 一些涉及栈的处理 */
lua_settop(L, top);

现在,我不确定如何在 Kahlua 中实现这个操作。但是在源代码中,我看到了 LuaCallFrame.getTop()LuaCallFrame.setTop(),所以代码应该是相似的。

2011-01-11 07:09:58
stackoverflow用户348439
stackoverflow用户348439

如果你正确地使用 Kahlua 框架,当从一个函数返回时,栈应该会自动清理。如果不是这样,那么你已经发现了一个 bug,我非常希望能够得到一个关于它的 bug 报告 :)

最好提供一个尽可能小的测试用例来展示问题。

2011-03-15 08:58:19