在 BISON 中调用%析构函数的时间是什么时候?我有以下野牛代码:
%union{
char * sval;
Variable * vval;
}
%token VARIABLE
%token Literal
%type <vval> Expression VARIABLE
%type <sval> Literal
%destructor { delete $$; } <vval>
%destructor { delete $$; } Literal
其中变量是一个类。我认为在处理完一行后,所有 Variable 对象都将被释放,但我看不到调用析构函数。这将直接导致内存泄漏...
编辑:要清楚;我为新令牌分配了一个新的 Variable 对象,并将此令牌推送到BISON堆栈。我希望删除 Variable ,当它被bison弹出并从堆栈中丢弃时。我认为%析构函数可以达到这个目的,但我不确定了..
答案 0 :(得分:6)
丢弃的符号如下:
- 在错误恢复的第一阶段期间弹出堆叠符号
- 错误恢复第二阶段的传入终端
- 当前前瞻和整个堆栈(当前除外) 右手边的符号)当 解析器立即返回,
- 解析器成功时的起始符号。
因此,如果您没有遇到错误,如果您立即返回(call YYABORT
or YYACCEPT
),将在堆栈上调用%destructor
,或者如果解析成功,它将在启动符号上调用它。 / p>
答案 1 :(得分:3)
我想通了,我应该在执行动作后释放(),例如
...
| String CONCAT String { $$ = concat($1,$3); free($1); free($3); }
...
这对我有用。