You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

LR Parser程序抛出std::bad_alloc异常问题排查请求

LR分析器运行时抛出std::bad_alloc异常的排查方案

核心原因与解决方向

std::bad_alloc本质是内存分配失败,结合LR分析器的场景,常见触发点及排查思路如下:

  • 无限循环/递归耗尽内存

    • 检查ACTION表与GOTO表的正确性,是否存在错误的移进/归约条目,导致程序陷入重复操作的死循环,持续申请内存直至耗尽。
    • 验证输入终止符$的处理逻辑,确认是否触发了错误的循环归约流程。
    • 排查递归实现的终止条件,避免无限递归调用。
  • 内存分配逻辑错误

    • 检查new/malloc等动态分配代码,是否存在重复分配、未正确释放,或一次性分配远超预期的内存块。
    • 确认栈结构(如std::stack或自定义栈)的实现,排查容量计算、扩容逻辑的错误。
  • 错误输入处理异常
    测试字符串(i*)$本身存在语法错误,但正常LR分析器应输出语法错误而非内存异常。检查字符扫描逻辑,确认处理错误输入时是否出现非法内存访问或无限循环。

调试实操建议

  1. 添加关键日志
    在移进/归约操作、内存分配的核心位置添加日志,记录状态栈大小、当前操作类型、内存分配次数,定位异常触发时的执行序列。
  2. 调试工具回溯
    用GDB或VS调试器在std::bad_alloc抛出点设置断点,回溯调用栈,锁定触发异常的具体代码行。
  3. 简化测试用例
    先用合法简单输入(如i$)验证基础逻辑,再逐步增加复杂度,定位问题出现的场景。

结合期望输出的排查点

期望输出要求逐个打印输入字符后输出input complete,需确认扫描器是否在拆分(、*等特殊字符时出错,导致重复生成字符对象耗尽内存。

期望输出格式:
(
i
+
i
)
*
i
input complete

内容的提问来源于stack exchange,提问作者daniel

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.25 18:28:10