我正在研究与Bison和Flex的词法分析器/解析器组合,并且稍微担心内存泄漏。
语法非常简单,而且(到目前为止)我已经能够使用以下定义:
#define YYSTYPE char const *
在Flex中,当我读取字符串时,我为该字符串分配了足够的内存,然后将其复制到yylval
。据我所知,这是非常标准的做法。
但是,我无法在任何地方找到任何告诉我何时应该在yylval中释放内存的文档。
Bison会自动为我处理吗?我的行动结束时是否必须这样做?或者我应该什么时候做呢?
答案 0 :(得分:4)
每次评估右侧时,需要将堆栈中的RHS项目(即$1
,$2
等)取消分配或复制到$$
执行缩减操作后,堆栈指针按RHS上的符号数递减,$$
成为最顶层的项,因此堆栈中剩余的任何内容都将丢失或被后续转移打乱堆栈。
此外,您可能最好使用包含令牌文本字符串及其整数标记值的堆栈类型的结构。