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

标签 c++ recursion memory stack-overflow

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

最佳答案

Is there any way that I can calculate the (maximum - 1) number of times that this [recursive] process can execute ...

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

将递归实现转换为迭代实现相当简单且定义明确:您只需

  1. 用显式状态容器替换隐式调用堆栈(和函数调用操作),例如std::stack<State>
  2. 不是递归调用,而是推送新调用的 State到你的堆栈,并继续循环
  3. 循环不是被调用,而是从弹出当前的 State 开始关闭堆栈,并处理它,这可能需要推送另一个新的 State如果您之前已经进行了另一个递归调用,就在那里

或者,您可以将当前的递归下降解析器拆分为分词器和 LALR(或类似)解析器,它们首先都是迭代的。例如,您可以使用 Flex 和 Bison (Lex/Yacc) 生成它们。

关于C++ 运行时抢占堆栈溢出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45788043/

相关文章:

c++ - 访问冲突

c++ - 使用 C++ 的 VS2012 中的奇怪智能感知行为。忽略#include?

c++ - 正则表达式以匹配 vim 中的函数返回类型

c++ - 从线程重绘启动画面/禁用断言

c++ - 代码已经进入curl_easy_perform()时如何中止网络请求

recursion - 使用 recur 在 Clojure 中缓存 "recursive"调用的值

python - 如何创建递归函数将多级字典对象打印到文件

mysql - 这些 SQL 闭包表示例有什么区别?

node.js - 我应该如何在 node.js 中保留用于 socket.io 交互的临时数据?

c++ - 如果我不将预写的字符串保存到变量中,它是否还在内存中?