LR Parser程序抛出std::bad_alloc异常问题排查请求
LR分析器运行时抛出
std::bad_alloc异常的排查方案 核心原因与解决方向
std::bad_alloc本质是内存分配失败,结合LR分析器的场景,常见触发点及排查思路如下:
无限循环/递归耗尽内存
- 检查ACTION表与GOTO表的正确性,是否存在错误的移进/归约条目,导致程序陷入重复操作的死循环,持续申请内存直至耗尽。
- 验证输入终止符
$的处理逻辑,确认是否触发了错误的循环归约流程。 - 排查递归实现的终止条件,避免无限递归调用。
内存分配逻辑错误
- 检查
new/malloc等动态分配代码,是否存在重复分配、未正确释放,或一次性分配远超预期的内存块。 - 确认栈结构(如
std::stack或自定义栈)的实现,排查容量计算、扩容逻辑的错误。
- 检查
错误输入处理异常
测试字符串(i*)$本身存在语法错误,但正常LR分析器应输出语法错误而非内存异常。检查字符扫描逻辑,确认处理错误输入时是否出现非法内存访问或无限循环。
调试实操建议
- 添加关键日志
在移进/归约操作、内存分配的核心位置添加日志,记录状态栈大小、当前操作类型、内存分配次数,定位异常触发时的执行序列。 - 调试工具回溯
用GDB或VS调试器在std::bad_alloc抛出点设置断点,回溯调用栈,锁定触发异常的具体代码行。 - 简化测试用例
先用合法简单输入(如i$)验证基础逻辑,再逐步增加复杂度,定位问题出现的场景。
结合期望输出的排查点
期望输出要求逐个打印输入字符后输出input complete,需确认扫描器是否在拆分(、*等特殊字符时出错,导致重复生成字符对象耗尽内存。
期望输出格式:
(
i
+
i
)
*
i
input complete
内容的提问来源于stack exchange,提问作者daniel
相关产品推荐
相关产品推荐

