C ++运行时抢占堆栈溢出

时间:2017-08-21 00:37:03

标签: c++ recursion memory stack-overflow

我试图编写一个可以解析最终用户文件的库,用于将一些简单的用户生成内容添加到项目中,我想尝试使库尽可能灵活。我使用递归来进行“对象”的标记化过程。它通过一系列四个函数链接但我与如何处理最终用户的嵌套对象快乐的潜在情况相矛盾。我知道我可以对程序可以递归的次数设置一个硬限制,但我想尽可能灵活。有什么办法可以计算出这个进程可以执行的(最大 - 1)次数,这样我就可以抢占堆栈溢出错误并返回错误或者需要处理的事情吗?

2 个答案:

答案 0 :(得分:2)

  

有什么方法可以计算出[递归]过程可以执行的(最大 - 1)次......

没有。它甚至不能保证调用链中的每个堆栈帧大小相同。

将递归实现转换为迭代实现非常简单且非常明确:您只需

  1. 用显式状态容器替换隐式调用堆栈(和函数调用操作),例如std::stack<State>
  2. 而不是递归调用,您将新呼叫的State推送到您的堆栈,然后继续循环
  3. 而不是被调用,循环开始于从堆栈弹出当前State,并处理该循环,如果您之前已经进行了另一次递归调用,则可能需要在那里推送另一个新的State
  4. 或者,您可以将当前的递归下降解析器拆分为一个tokenizer和LALR(或类似的)解析器,它们首先都是迭代的。例如,您可以使用Flex和Bison(Lex / Yacc)生成这些。

答案 1 :(得分:1)

在Windows上,您可以使用SEH框架使用__try / __来捕获堆栈溢出异常,并退出程序。
但是,如果您的应用程序使用的是C ++,那么您需要使用/ EHa或/ EHsc标志进行编译。 有关使用SEH和C \ C ++的详细信息以及使用/ EHa和/ EHsc标志的详细信息,请查看此链接。
https://docs.microsoft.com/en-us/cpp/cpp/structured-exception-handling-c-cpp

__try  
{  
    //code which might generate stack overflow  
}  
__except(EXCEPTION_EXECUTE_HANDLER)  
{  
    //handle stack overflow exception, throw error and exit program     
} 

希望这有帮助!